我们如何更改pandas中数据帧行的数据类型?

时间:2015-11-05 04:57:38

标签: python

我正在进行API调用并将结果收集为DataFrame对象中的行。前两行是文本,其余是数字。有没有什么方法可以在每列中包含不同的数据类型,或者换句话说,我们可以为每个 设置数据类型吗?我尝试过convert_objects,astype等。在添加到DataFrame之前转换行但它们不起作用。

Example: Sample DataFrame

   0     1     2
0  text1 text2 text3
1  text1 text2 text3
2  no1   no2   no3
...

3 个答案:

答案 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 dictlists用于聚合阶段,然后以某种方式处理数据并将其粘贴到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()使这种区别无关紧要。