在数据库中,有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]
它没有按照我的期望工作,请问我是否可以通过其他方式为我建立同样的建议。 在此先感谢:)
答案 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