pandas concat生成nan值

Geo*_*ler 35 python concatenation nan dataframe pandas

我很好奇为什么pandas中两个数据帧的简单连接:

shape: (66441, 1)
dtypes: prediction    int64
dtype: object
isnull().sum(): prediction    0
dtype: int64

shape: (66441, 1)
CUSTOMER_ID    int64
dtype: object
isnull().sum() CUSTOMER_ID    0
dtype: int64
Run Code Online (Sandbox Code Playgroud)

具有相同的形状,两者都没有NaN值

foo = pd.concat([initId, ypred], join='outer', axis=1)
print(foo.shape)
print(foo.isnull().sum())
Run Code Online (Sandbox Code Playgroud)

如果加入,会导致很多NaN值.

(83384, 2)
CUSTOMER_ID    16943
prediction     16943
Run Code Online (Sandbox Code Playgroud)

如何解决此问题并防止引入NaN值?

试图重现它

aaa  = pd.DataFrame([0,1,0,1,0,0], columns=['prediction'])
print(aaa)
bbb  = pd.DataFrame([0,0,1,0,1,1], columns=['groundTruth'])
print(bbb)
pd.concat([aaa, bbb], axis=1)
Run Code Online (Sandbox Code Playgroud)

失败,例如工作得很好,因为没有引入NaN值.

jez*_*ael 45

我认为不同的索引值存在问题,所以concat无法对齐get NaN:

aaa  = pd.DataFrame([0,1,0,1,0,0], columns=['prediction'], index=[4,5,8,7,10,12])
print(aaa)
    prediction
4            0
5            1
8            0
7            1
10           0
12           0

bbb  = pd.DataFrame([0,0,1,0,1,1], columns=['groundTruth'])
print(bbb)
   groundTruth
0            0
1            0
2            1
3            0
4            1
5            1

print (pd.concat([aaa, bbb], axis=1))
    prediction  groundTruth
0          NaN          0.0
1          NaN          0.0
2          NaN          1.0
3          NaN          0.0
4          0.0          1.0
5          1.0          1.0
7          1.0          NaN
8          0.0          NaN
10         0.0          NaN
12         0.0          NaN
Run Code Online (Sandbox Code Playgroud)

解决方法是,reset_index如果索引值不是必需的:

aaa.reset_index(drop=True, inplace=True)
bbb.reset_index(drop=True, inplace=True)

print(aaa)
   prediction
0           0
1           1
2           0
3           1
4           0
5           0

print(bbb)
   groundTruth
0            0
1            0
2            1
3            0
4            1
5            1

print (pd.concat([aaa, bbb], axis=1))
   prediction  groundTruth
0           0            0
1           1            0
2           0            1
3           1            0
4           0            1
5           0            1
Run Code Online (Sandbox Code Playgroud)

  • 事实上你的评论来自`pd.concat([ypred.reset_index(drop = True),initId.reset_index(drop = True)],axis = 1)`工作得很好!非常感谢. (5认同)

小智 5

你可以这样做:

concatenated_dataframes = concat(
    [
        dataframe_1.reset_index(drop=True),
        dataframe_2.reset_index(drop=True),
        dataframe_3.reset_index(drop=True)
    ],
    axis=1,
    ignore_index=True,
)

concatenated_dataframes_columns = [
    list(dataframe_1.columns),
    list(dataframe_2.columns),
    list(dataframe_3.columns)
]
    
flatten = lambda nested_lists: [item for sublist in nested_lists for item in sublist]

concatenated_dataframes.columns = flatten(concatenated_dataframes_columns)
Run Code Online (Sandbox Code Playgroud)

连接多个DataFrames 并保留列名 / 避免NaN