Pandas iterrows更改列的类型。根据{{3}} github问题,这是一种预期的行为。
有什么想法将pythonic和优雅的方法重新投射到原始类型? 请注意,我有多种列类型。
最小的例子
df = pd.DataFrame([range(5), range(5)])
df.iloc[:,1] = df.iloc[:,1].astype('float')
for row in df.iterrows():
print row
结果
(0, 0 0.0
1 1.0
2 2.0
3 3.0
4 4.0
Name: 0, dtype: float64)
(1, 0 0.0
1 1.0
2 2.0
3 3.0
4 4.0
Name: 1, dtype: float64)
请注意,df.dtypes
会返回列的类型,但是,我无法想到使用它将行转换回该类型的优雅方式。
答案 0 :(得分:5)
请尝试使用df.itertuples
:
df = pd.DataFrame([range(5), range(5)], columns=list('abcde'))
df.iloc[:,1] = df.iloc[:,1].astype('float')
for row in df.itertuples():
print(row)
Pandas(Index=0, a=0, b=1.0, c=2, d=3, e=4)
Pandas(Index=1, a=0, b=1.0, c=2, d=3, e=4)
答案 1 :(得分:0)
您可以通过以下方式进行此迭代,保持数据类型:
import pandas
df = pandas.DataFrame({'ints': list(range(5)), 'floats': [float(i) for i in range(5)]})
print(df)
for idx in df.index:
print(f'Integer number: {df.loc[idx,"ints"]}')
print(f'Float number: {df.loc[idx,"floats"]}')
输出(在 Python 3.8.5 中)是
ints floats
0 0 0.0
1 1 1.0
2 2 2.0
3 3 3.0
4 4 4.0
Integer number: 0
Float number: 0.0
Integer number: 1
Float number: 1.0
Integer number: 2
Float number: 2.0
Integer number: 3
Float number: 3.0
Integer number: 4
Float number: 4.0