如果我直接打印出一个数据帧,我会得到正确的输出和正确的数据类型。但是,当我尝试迭代相同的数据帧时,数据类型正在发生变化。
这是我的计划:
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数据类型。在迭代数据帧时,我可以保留数据类型的方式是什么?
答案 0 :(得分:5)
来自the docs:
因为iterrows为每一行返回一个Series,它不会在行中保留dtypes(dtypes保留在DataFrames的列之间)。
您可以使用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
>>>
我在文档中找不到系列数据类型是同构的明确声明,但推断出它,就像一个Numpy ndarray,构造函数有一个dtype参数适用于系列中的所有值:
带轴标签的一维ndarray(包括时间序列)。
看起来即使Series中只有一个值是float,系列dtype也将是float:
>>> 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 :(得分:0)
非常感谢你。是的,效果很好。下面的代码是我需要的。再次感谢您的帮助。
for r in df.itertuples(index=False, name='summary_stats'):
for item in r:
print(item)
我得到了这个输出:
>>>9.37556366342
0.000101673198518
2
471
473