有条件地将单元格的内容合并到列中

时间:2019-04-22 20:45:15

标签: python pandas dataframe

正在寻找一种转换以下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']}
)

2 个答案:

答案 0 :(得分:3)

您可以直接调用ffillagg,而无需使用applylambda

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