如何在 Pandas 中迭代 DataFrame 时保留数据类型?

6
如果我直接打印数据框,我会得到正确的输出和正确的数据类型。 但是,当我尝试迭代相同的数据框时,数据类型会发生变化。
这是我的程序:
import pandas as pd

F = 9.37556366342
p = 0.000101673198518
df_between = 2
df_within = 471
df_total = 473

summary_stats_vals = [(F,p,df_between,df_within,df_total)]
labels = ['F-statistics', 'p-value', 'df-between', 'df-within', 'df-total']
df = pd.DataFrame.from_records(summary_stats_vals,columns=labels)

print(df)
print()

#Iterating the dataframe
for index, row in df.iterrows():
    df_row = list()
    df_row.append(index)
    for col in df.columns:
        df_row.append(row[col])
    print(row)

如下面的截图所示,在迭代时,df_between、df_within和df_total的数据类型并未保留。它们从int数据类型变为了float数据类型。有什么方法可以在迭代DataFrame时保留数据类型?

enter image description here


请不要发布数据的图片。请将其复制并粘贴到您的问题中,格式化为代码。 - wwii
2个回答

12

根据文档

iterrows返回每一行的Series,因此不会在行之间保留数据类型(对于DataFrame中的列,数据类型会得到保留)。

您可以使用DataFrame.itertuples()获取每一行的namedtuples

>>> for r in df.itertuples(index=False):
...     print(r)

Pandas(_0=9.3755636634199995, _1=0.000101673198518, _2=2, _3=471, _4=473)
>>> for r in df.itertuples(index=False):
...     print(r._3)

471

将您的列名更改为有效的Python标识符可能更有意义:

...
labels = ['F_statistics', 'p_value', 'df_between', 'df_within', 'df_total']
...

>>> for r in df.itertuples(index=False, name='Stuff'):
...     print(r)

Stuff(F_statistics=9.3755636634199995, p_value=0.000101673198518, df_between=2, df_within=471, df_total=473)
>>>
>>> for r in df.itertuples(index=False, name='Stuff'):
...     print(r.df_total)

473
>>> 

我在文档中没有找到显式说明Series数据类型是同构的,但可以推断出它的行为类似于Numpy的ndarray,并且构造函数有一个dtype参数,该参数适用于Series中的所有值:

带有轴标签的一维ndarray(包括时间序列)。

即使Series中只有一个值是浮点数,Series的数据类型似乎也会是浮点数:

>>> s = pd.Series([1,2,3,4.1], index=['a','b','c','d'])
>>> s
a    1.0
b    2.0
c    3.0
d    4.1
dtype: float64
>>> 

1

非常感谢wwii。是的,那个很有效。以下代码就是我需要的。再次感谢您的帮助。

for r in df.itertuples(index=False, name='summary_stats'):
    for item in r:
        print(item)

我得到了这个输出:

>>>9.37556366342
   0.000101673198518
   2
   471
   473

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接