我正在进行API调用并将结果收集为DataFrame对象中的行。前两行是文本,其余是数字。有没有什么方法可以在每列中包含不同的数据类型,或者换句话说,我们可以为每个 行 设置数据类型吗?我尝试过convert_objects,astype等。在添加到DataFrame之前转换行但它们不起作用。
Example: Sample DataFrame
0 1 2
0 text1 text2 text3
1 text1 text2 text3
2 no1 no2 no3
...
答案 0 :(得分:2)
示例
>>> 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
,可以执行以下操作,
将第1行的dtype
更改为int:
>>> df.iloc[1].apply(int)
c1 12
c2 22
Name: 1, dtype: int64
答案 1 :(得分:1)
不,这是不可能的。有点简单,您可以将DataFrame
视为numpy.array
的列dict
之类的内容,并且这些内容是同类型的。
你写
这就是我收集API调用结果的方式。修复列和追加行更加健壮,而不是继续增加列和修复行。
考虑到这种使用模式和类型,您可以考虑DataFrames是否适合您。根据我的经验,DataFrames具有动态逐行追加的可怕性能。您可以考虑将常规Python dict
和lists
用于聚合阶段,然后以某种方式处理数据并将其粘贴到DataFrame
。
答案 2 :(得分:0)
鉴于您正在收集API调用的结果,您很可能将结果存储为元组列表作为中间步骤,而不是附加到DataFrame
。这应该会产生你想要的东西。
def api_call(x):
return 5.0, 'a', 42
df = pandas.DataFrame(map(api_call, args))
注意,如果您使用的是Python 2.x,请使用itertools.imap
代替map
。
作为旁注,添加行而不是添加列更健壮的评论是不可信的。 DataFrame.transpose()
使这种区别无关紧要。