我有一个数据框,其中包含不同数据类型(浮点数和整数)的列。两行的顺序错误,我需要交换它们,但是将一行复制到另一行不起作用。
import pandas as pd
df = pd.DataFrame([
{"a":2.5, "b":10},
{"a":2.7, "b":12},
{"a":2.8, "b":16},
{"a":3.1, "b":18}
])
这确实会复制值,但之后所有行的类型均为“ float”(Series对象只有一个数据类型。):
df.iloc[1] = df.iloc[2].copy() # changes datatype if b to float
使用切片复制行会将整个行设置为NaN:
df.iloc[1:2] = df.iloc[2:3].copy() # sets row 1 to NaN,NaN
a b
0 2.5 10.0
1 NaN NaN
2 2.8 16.0
3 3.1 18.0
2个问题:
NaN
的来源是什么?答案 0 :(得分:1)
在第二种情况下,NaN的来源是什么?
问题是切片的DataFrames的索引值不同,大熊猫无法对齐行,因此创建了NaN:
print (df.iloc[1:2])
a b
1 2.7 12
print (df.iloc[2:3])
a b
2 2.8 16
如何在保持数据类型的同时将一行复制到另一行?
一种解决方案是创建一行DataFrame并更改索引名称以进行对齐:
df.iloc[[1]] = df.iloc[[2]].rename(index={2:1}).copy()
如果需要索引索引值,则更一般:
df.iloc[[1]] = df.iloc[[2]].rename(index={df.index[2]: df.index[1]}).copy()
print (df)
0 2.5 10
1 2.8 16
2 2.8 16
3 3.1 18
可以转换为numpy数组,但是dtypes会发生变化。