我一直在尝试融化这个柱子
d = {'key': [1,2,3,4,5], 'a': ['None','a', 'None','None','None'], 'b': ['None','None','b','None','None'],'c':['None','None','None','c','c']}
df = pd.DataFrame(d)
我需要看起来像这样
我试过:
df = pd.melt(df,id_vars=['key'], var_name = 'letters')
但是我得到了:
最佳答案
如果需要在 key
列之后获取每行的第一个非 None
值,请使用 DataFrame.set_index
替换可能的 None
字符串,回填缺失值并按位置选择第一列,最后使用 Series.reset_index
:
df = (df.set_index('key')
.replace('None', np.nan)
.bfill(axis=1)
.iloc[:, 0]
.reset_index(name='letter')))
print (df)
key letter
0 1 NaN
1 2 a
2 3 b
3 4 c
4 5 c
如果可能,每行使用多个非 None
值:
d = {'key': [1,2,3,4,5],
'a': ['None','a', 'None','None','None'],
'b': ['None','b','b','None','None'],
'c':['None','None','None','c','c']}
df = pd.DataFrame(d)
df = (df[['key']].join(df.set_index('key')
.replace('None', np.nan)
.stack()
.groupby(level=0)
.agg(','.join)
.rename('letter'), on='key'))
print (df)
key letter
0 1 NaN
1 2 a,b
2 3 b
3 4 c
4 5 c
或者:
df = (df.set_index('key')
.replace('None', np.nan)
.apply(lambda x: ','.join(x.dropna()), axis=1)
.replace('', np.nan)
.reset_index(name='letter'))
print (df)
key letter
0 1 NaN
1 2 a,b
2 3 b
3 4 c
4 5 c
关于python - 将多列融合为一列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72801987/