如何更改pandas中dataframe行的数据类型?

2024-09-29 01:24:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在进行API调用,并将结果收集为DataFrame对象中的行。前两行是文本,其余的是数字。是否有任何方法可以在每一列中使用不同的数据类型,或者说是不同的,我们是否可以为每一行设置一个数据类型?我试过转换对象,astype等人。在添加到数据帧之前转换行,但它们不起作用。

Example: Sample DataFrame

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

Tags: 数据sample对象方法文本apidataframeexample
3条回答

不,不可能。简单地说,可以将DataFrame看作是^{}s的一列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

考虑到您正在收集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()使得这一区别无关紧要。

示例

>>> 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

相关问题 更多 >