数据框:将一行复制到另一行,同时保留不同的dtypes列

时间:2019-06-17 12:37:50

标签: python pandas dataframe

我有一个数据框,其中包含不同数据类型(浮点数和整数)的列。两行的顺序错误,我需要交换它们,但是将一行复制到另一行不起作用。

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的来源是什么?
  • 如何在保留数据类型的同时将一行复制到另一行?

1 个答案:

答案 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会发生变化。