我有一只熊猫df:
A B C
1 10 11 23
2 NaN 2 15
3 NaN 3 31
4 NaN NaN 56
我想将行向左移动以在索引上排列如下:
A B C
1 10 11 23
2 2 15 NaN
3 3 31 NaN
4 56 NaN NaN
我一直在尝试编写一个可以应用于df行的函数。我在想nan_counts = row.isnull().count()
我是否可以使用shift(-Nan_counts,axis=1)
,但我绝对没有运气。
答案 0 :(得分:1)
使用apply
与axis=1
一起使用dropna
进行行处理:
df = df.apply(lambda x: pd.Series(x.dropna().values), 1)
print (df)
0 1 2
1 10.0 11.0 23.0
2 2.0 15.0 NaN
3 3.0 31.0 NaN
4 56.0 NaN NaN
对于列名称(通用解决方案):
print (df)
A B C D E
1 10.0 11.0 23 NaN NaN
2 NaN 2.0 15 NaN NaN
3 NaN 3.0 31 NaN NaN
4 NaN NaN 56 NaN NaN
df1 = df.apply(lambda x: pd.Series(x.dropna().values), 1)
df1.columns = df.columns[:len(df1.columns)]
df1 = df1.reindex_axis(df.columns, 1)
print (df1)
A B C D E
1 10.0 11.0 23.0 NaN NaN
2 2.0 15.0 NaN NaN NaN
3 3.0 31.0 NaN NaN NaN
4 56.0 NaN NaN NaN NaN
答案 1 :(得分:1)
对于每一行,使用列表推导仅保留非nan值并将其转换为Series。当系列组合时,熊猫将自动用nan填充缺失值。
df.apply(lambda x: pd.Series([e for e in x if pd.notnull(e)]), axis=1)
Out[27]:
0 1 2
1 10.0 11.0 23.0
2 2.0 15.0 NaN
3 3.0 31.0 NaN
4 56.0 NaN NaN