根据Python数据框中的三列连接ID

时间:2019-04-30 09:42:41

标签: python-3.x

在数据库中,有4列(A,B,C,D)。 A,B和C列用于对D列进行分组。基于A,B,C列,我想连接D列Id。考虑以下是我的数据库:

A   B   C   D
A1  B1  C1  12
A1  B1  C1  15
A2  B2  C2  16
A4  B4  C4  18
A1  B1  C1  19

运行代码后,我期望得到以下结果:

A   B   C   D
A1  B1  C1  12_15_19
A2  B2  C2  16
A4  B4  C4  18

我已使用以下代码执行此操作:

df23['combined']=df23.apply(lambda x:'%s_%s_%s' % (x['A'],x['B'],x['C']),axis=1)

for i in range(len(df23)):
    df23['ABC'] = df23.iloc[:,3]
    for j in range(len(df23)+1):
      cur = df23.iloc[i,3]
      nxt = df23.iloc[j,3]
      if cur==nxt:
       df23['ABC'] = df23.iloc[i,4] +'_'+ df23.iloc[j,3]

它没有按照我的期望工作,请问我是否可以通过其他方式为我建立同样的建议。 在此先感谢:)

1 个答案:

答案 0 :(得分:0)

  

pandas.DataFrame.groupby

     

语法:DataFrame.groupby(by = None,axis = 0,level = None,as_index = True,   sort = True,group_keys = True,squeeze = False,observed = False,   ** kwargs)[来源]

     

使用映射器或按一系列列对DataFrame或Series进行分组。

     

groupby操作涉及拆分对象的某种组合,   应用函数,并将结果合并。这可以用来   将大量数据分组并在这些组上进行计算操作

  

pandas.DataFrame.apply

     

语法:DataFrame.apply(func,axis = 0,broadcast = None,raw = False,   reduce = None,result_type = None,args =(),** kwds)[源代码]

     

沿DataFrame的轴应用一个函数。

     

传递给函数的对象是Series对象,其索引为   DataFrame的索引(axis = 0)或DataFrame的列   (轴= 1)。默认情况下(result_type = None),最终的返回类型为   从应用函数的返回类型推断。否则   取决于result_type参数。

import pandas as pd
# Create dataframe
raw_data = {'A': ['A1', 'A1', 'A2', 'A4', 'A1'],
        'B': ['B1', 'B1', 'B2', 'B4', 'B1'],
        'C': ['C1', 'C1', 'C2', 'C4', 'C1'],
        'D': [12, 15, 16,18, 19]}
df = pd.DataFrame(raw_data, columns = ['A', 'B', 'C', 'D'])
print (df)
df_grouped = df.groupby(['A','B','C'])['D'].apply(lambda text: ''.join(text.to_string(index=False))).str.replace('(\\n)', '_').reset_index()
print (df_grouped)

输出:

    A   B   C   D
0  A1  B1  C1  12
1  A1  B1  C1  15
2  A2  B2  C2  16
3  A4  B4  C4  18
4  A1  B1  C1  19

    A   B   C            D
0  A1  B1  C1   12_ 15_ 19
1  A2  B2  C2           16
2  A4  B4  C4           18

注意:如果要打印不带索引的data.frame,请使用:

print (df.to_string(index = False))
print (df_grouped.to_string(index = False))

输出:

  A   B   C   D
 A1  B1  C1  12
 A1  B1  C1  15
 A2  B2  C2  16
 A4  B4  C4  18
 A1  B1  C1  19

  A   B   C            D
 A1  B1  C1   12_ 15_ 19
 A2  B2  C2           16
 A4  B4  C4           18