2024-09-29 01:24:15 发布
网友
我正在进行API调用,并将结果收集为DataFrame对象中的行。前两行是文本,其余的是数字。是否有任何方法可以在每一列中使用不同的数据类型,或者说是不同的,我们是否可以为每一行设置一个数据类型?我试过转换对象,astype等人。在添加到数据帧之前转换行,但它们不起作用。
Example: Sample DataFrame 0 1 2 0 text1 text2 text3 1 text1 text2 text3 2 no1 no2 no3 ...
不,不可能。简单地说,可以将DataFrame看作是^{}s的一列dict,并且这些列是均匀类型的。
DataFrame
dict
你写的
That's the way I am collecting the results of API calls. It's more robust to fix the columns and append rows, rather than keep increasing columns and fix rows.
考虑到这种使用模式和类型,您可能会考虑数据帧是否完全适合您。根据我的经验,DataFrames对于动态逐行追加有糟糕的性能。您可以考虑使用常规Pythondicts和listss作为聚合阶段,然后以某种方式处理数据并将其粘贴到DataFrame。
lists
考虑到您正在收集API调用的结果,很可能应该将结果存储为元组列表作为中间步骤,而不是附加到DataFrame。这会得到你想要的结果。
def api_call(x): return 5.0, 'a', 42 df = pandas.DataFrame(map(api_call, args))
注意,如果您使用的是Python 2.x,请使用itertools.imap,而不是map。
itertools.imap
map
另一方面,关于添加行而不是添加列更健壮的评论是不可信的。DataFrame.transpose()使得这一区别无关紧要。
DataFrame.transpose()
示例
>>> import pandas as pd >>> df = pd.DataFrame([['txt1','txt2'], [12, 22]], columns=['c1', 'c2']) >>> df c1 c2 0 txt1 txt2 1 12 22
行是一个对象:
>>> df.iloc[0] c1 txt1 c2 txt2 Name: 0, dtype: object >>> df.iloc[1] c1 12 c2 22 Name: 1, dtype: object
每个单元格都取决于您在其中输入的值:
>>> df.iloc[0]['c2'] 'txt2' >>> type(df.iloc[0]['c2']) <type 'str'> >>> df.iloc[1]['c2'] 22 >>> type(df.iloc[1]['c2']) <type 'int'>
如果要指定行的dtype,可以执行以下操作
dtype
将第1行的dtype更改为int:
>>> df.iloc[1].apply(int) c1 12 c2 22 Name: 1, dtype: int64
不,不可能。简单地说,可以将} s的一列
DataFrame
看作是^{dict
,并且这些列是均匀类型的。你写的
考虑到这种使用模式和类型,您可能会考虑数据帧是否完全适合您。根据我的经验,DataFrames对于动态逐行追加有糟糕的性能。您可以考虑使用常规Python
dict
s和lists
s作为聚合阶段,然后以某种方式处理数据并将其粘贴到DataFrame
。考虑到您正在收集API调用的结果,很可能应该将结果存储为元组列表作为中间步骤,而不是附加到
DataFrame
。这会得到你想要的结果。注意,如果您使用的是Python 2.x,请使用
itertools.imap
,而不是map
。另一方面,关于添加行而不是添加列更健壮的评论是不可信的。
DataFrame.transpose()
使得这一区别无关紧要。示例
行是一个对象:
每个单元格都取决于您在其中输入的值:
如果要指定行的
dtype
,可以执行以下操作将第1行的
dtype
更改为int:相关问题 更多 >
编程相关推荐