如何在熊猫中迭代数据框时保留数据类型?

Posted

技术标签:

【中文标题】如何在熊猫中迭代数据框时保留数据类型?【英文标题】:How to preserve the datatype while iterating dataframe in pandas? 【发布时间】:2018-07-21 05:12:59 【问题描述】:

如果我直接打印出一个数据帧,我会得到具有正确数据类型的正确输出。但是,当我尝试迭代相同的数据帧时,数据类型正在发生变化。

这是我的程序:

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 数据类型。在迭代数据帧时我可以如何保留数据类型?

【问题讨论】:

请不要发布数据图片。将其复制并粘贴到格式化为代码的问题中。 【参考方案1】:

来自the docs:

因为 iterrows 为每一行返回一个系列,所以它不会跨行保留 dtypes(对于 DataFrames,dtypes 会跨列保留)。

您可以使用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 参数到系列中的所有值:

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

看起来即使系列中只有一个值是浮点数,系列 dtype 也会是浮点数:

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

【讨论】:

【参考方案2】:

非常感谢二战。是的,效果很好。下面的代码是我需要的。再次感谢您的帮助。

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

我得到这个输出:

>>>9.37556366342
   0.000101673198518
   2
   471
   473

【讨论】:

以上是关于如何在熊猫中迭代数据框时保留数据类型?的主要内容,如果未能解决你的问题,请参考以下文章

当列数据类型为列表时如何过滤熊猫数据框

如何在遍历熊猫数据框时创建新列并插入行值

熊猫:连接数据框时如何聚合两个列表列

类型函数的熊猫过滤参数不可迭代[重复]

从 Google BigQuery 创建熊猫数据框时如何执行 na_values

为啥在附加熊猫数据框时列顺序会发生变化?