正在寻找一种转换以下df的疯癫方法:
name desc
0 A a
1 NaN aa
2 NaN aaa
3 B b
4 NaN bb
进入:
name desc
0 A a
aa
aaa
3 B b
bb
# strings in desc are concat-ed together with end of line char
我正在考虑itertuple或backfill + groupby的一般方向,但是这两种方法都需要一些技巧。
这是起点:
import pandas as pd
import numpy as np
nan = np.nan
df = pd.DataFrame(
{'name': ['A', nan, nan, 'B', nan],
'desc': ['a', 'aa', 'aaa', 'b', 'bb']}
)
答案 0 :(得分:3)
您可以直接调用ffill
和agg
,而无需使用apply
和lambda
In [719]: df.ffill().groupby('name').agg('\n'.join).reset_index()
Out[719]:
name desc
0 A a\naa\naaa
1 B b\nbb
或:
In [729]: df.ffill().groupby('name', as_index=False).agg({'desc': '\n'.join})
Out[729]:
name desc
0 A a\naa\naaa
1 B b\nbb
答案 1 :(得分:2)
我认为您需要fillna(method='ffill')
和groupby
的组合。
这看起来如何?
import pandas as pd
import numpy as np
nan = np.nan
df = pd.DataFrame(
{'name': ['A', nan, nan, 'B', nan],
'desc': ['a', 'aa', 'aaa', 'b', 'bb']}
)
df['name'] = df['name'].fillna(method='ffill')
df = df.groupby('name')['desc'].apply(lambda d: '\n'.join(d)).reset_index()
print df
打印
name desc
0 A a\naa\naaa
1 B b\nbb