合并pandas中的条目

时间:2017-05-15 21:43:19

标签: python list pandas

假设我有下表。

import pandas as pd
sales = {'Account': ['Jones LLC', 'Alpha Co', 'Blue Inc'],
         '1': ['a', 'b', 'c'],
         '2': ['', 'e, g', 'f, h'],
         '3': ['a', 'g', 'h']}
df = pd.DataFrame.from_dict(sales).set_index('Account')
df

输出:

               1  2     3
    Account
    Jones LLC  a        a
    Alpha Co   b  e, g  g
    Blue Inc   c  f, h  h

我想创建另一个列'4',结果是第1,2和3列的组合:

           1  2     3   4
Account
Jones LLC  a        a   a
Alpha Co   b  e, g  g   b, e, g
Blue Inc   c  f, h  h   c, f, h

我尝试使用以下内容:

df['4'] = [', '.join([df['1'][x],df['2'][x],df['3'][x]]) for x in range(df.shape[0])]

输出:

           1  2     3   4
Account
Jones LLC  a        a   , a
Alpha Co   b  e, g  g   b, e, g, g
Blue Inc   c  f, h  h   c, f, h, h

问题是:

  1. 在第一行中,它是, a而不是a
  2. 重复:b, e, g, g而不是b, e, g
  3. 我需要显式写df['1'][x], df['2'][x], df['3'][x]而不是定义列表['1','2','3']并迭代列表。
  4. 我想知道是否有一种快速的方法可以在不使用df.iterrows()的情况下执行此操作,检查是否有任何条目为空,然后根据需要进行组合?

2 个答案:

答案 0 :(得分:2)

看起来您需要排除空列,然后删除重复项。

<强>代码:

df['4'] = [', '.join(sorted(set(sum(
    [[y.strip() for y in df[c][x].split(',')] 
     for c in '123' if df[c][x].strip()], []))))
    for x in range(df.shape[0])]

测试代码:

import pandas as pd
sales = {'Account': ['Jones LLC', 'Alpha Co', 'Blue Inc'],
         '1': ['a', 'b', 'c'],
         '2': ['', 'e, g', 'f, h'],
         '3': ['a', 'g', 'h']}
df = pd.DataFrame.from_dict(sales).set_index('Account')

df['4'] = [', '.join(sorted(set(sum(
    [[y.strip() for y in df[c][x].split(',')] 
     for c in '123' if df[c][x].strip()], []))))
    for x in range(df.shape[0])]

<强>结果:

           1     2  3        4
Account                       
Jones LLC  a        a        a
Alpha Co   b  e, g  g  b, e, g
Blue Inc   c  f, h  h  c, f, h

答案 1 :(得分:1)

替代解决方案:

In [59]: df[4] = (df.replace(r'[\s,]*','',regex=True)
    ...:            .sum(1)
    ...:            .str.extractall(r'(.)')
    ...:            .unstack()
    ...:            .apply(lambda x: ','.join(set(x.dropna())), axis=1))
    ...:

In [60]: df
Out[60]:
           1     2  3      4
Account
Jones LLC  a        a      a
Alpha Co   b  e, g  g  b,e,g
Blue Inc   c  f, h  h  c,f,h