如何在熊猫中创建与多列相结合的数据框列
Posted
技术标签:
【中文标题】如何在熊猫中创建与多列相结合的数据框列【英文标题】:How to create a dataframe column combined with multiple columns in pandas 【发布时间】:2018-07-06 06:27:58 【问题描述】:我有一些跟踪公司名称随时间变化的数据。但是,我不想将每个名称都更改为一行,而是希望将它们全部连接到一个字段中。
输入数据可以使用:
#Import the modules:
import pandas as pd
import numpy as np
#Create the empty data frame:
df = pd.DataFrame(columns=['dt','old_name','new_name'])
#Populate the data frame:
df.loc[len(df)] = ['01/01/2001', 'AAA', 'BBB']
df.loc[len(df)] = ['02/02/2002', 'BBB', 'CCC']
df.loc[len(df)] = ['03/03/2003', 'CCC', 'DDD']
#View the output:
df
我希望 输出 的外观可以使用以下方法创建:
#Create the empty data frame:
end_df = pd.DataFrame(columns=['dt','name'])
#Populate:
end_df.loc[len(end_df)] = ['01/01/2001', 'AAA-BBB-CCC-DDD']
end_df.loc[len(end_df)] = ['02/02/2002', 'AAA-BBB-CCC-DDD']
end_df.loc[len(end_df)] = ['03/03/2003', 'AAA-BBB-CCC-DDD']
#View the output:
end_df
编辑:我正在使用 pandas 数据框在 Pyspark2 中运行此代码 - 以防对语法产生任何影响。 另外,我的数据集中有多组名称。我的意思是,有更多的名称更改组与需要连接名称的第一组无关。
分组输入示例:
#Create the empty data frame:
df = pd.DataFrame(columns=['dt','old_name','new_name'])
#Populate the data frame:
df.loc[len(df)] = ['01/01/2001', 'AAA', 'BBB']
df.loc[len(df)] = ['02/02/2002', 'BBB', 'CCC']
df.loc[len(df)] = ['03/03/2003', 'CCC', 'DDD']
df.loc[len(df)] = ['02/01/2001', 'XXX', 'YYY']
df.loc[len(df)] = ['03/02/2002', 'YYY', 'ZZZ']
样本分组输出:
#Create the empty data frame:
end_df = pd.DataFrame(columns=['dt','name'])
#Populate:
end_df.loc[len(end_df)] = ['01/01/2001', 'AAA-BBB-CCC-DDD']
end_df.loc[len(end_df)] = ['02/02/2002', 'AAA-BBB-CCC-DDD']
end_df.loc[len(end_df)] = ['03/03/2003', 'AAA-BBB-CCC-DDD']
end_df.loc[len(end_df)] = ['02/01/2001', 'XXX-YYY-ZZZ']
end_df.loc[len(end_df)] = ['03/02/2002', 'XXX-YYY-ZZZ']
如果您需要任何进一步的说明,请告诉我。
【问题讨论】:
为什么这个标签是pyspark
?您显示的所有内容都是pandas
。
很抱歉给您带来了困惑——我还没有完成时不小心发布了这个问题。我现在将添加编辑。
【参考方案1】:
你需要np.flatten and np.unique
import numpy as np
end_df = pd.DataFrame(columns=['dt','name'])
end_df['dt']=df['dt'].copy()
flat=df[df.columns[1:]].values.flatten()
end_df['name']='-'.join(np.unique(flat))
print(end_df)
dt name
0 01/01/2001 AAA-BBB-CCC-DDD
1 02/02/2002 AAA-BBB-CCC-DDD
2 03/03/2003 AAA-BBB-CCC-DDD
【讨论】:
嗨 pyd。感谢您的答复。我刚刚编辑了我的问题,因为我忘了提到我的数据集中有多组名称更改。除此之外,您的解决方案效果很好!您知道如何将每个名称更改“分组”吗?【参考方案2】:创建了两个dicts
:old_new_dict
从旧名称遍历到新名称,old_new_dict_rev
从新名称遍历到旧名称:
old_new_dict = k:v for k,v in zip(df.old_name,df.new_name)
old_new_dict_rev = v:k for k,v in zip(df.old_name,df.new_name)
函数find_tree
,双向遍历并加入它们以创建名称的完整路径。
def find_tree(name):
left_list = []
right_list = []
name_l, name_r = name, name
while(name_l in old_new_dict_rev):
left_list.append(old_new_dict_rev[name_l])
name_l = old_new_dict_rev[name_l]
left_list.reverse()
while(name_r in old_new_dict):
right_list.append(old_new_dict[name_r])
name_r = old_new_dict[name_r]
return "-".join(left_list + [name] + right_list)
将完整路径添加为数据框df
中的name
列:
df['name'] = df['old_name'].apply(lambda x: find_tree(x))
end_df = df.drop(['old_name','new_name'], axis = 1)
end_df
# dt name
#0 01/01/2001 AAA-BBB-CCC-DDD
#1 02/02/2002 AAA-BBB-CCC-DDD
#2 03/03/2003 AAA-BBB-CCC-DDD
#3 02/01/2001 XXX-YYY-ZZZ
#4 03/02/2002 XXX-YYY-ZZZ
【讨论】:
以上是关于如何在熊猫中创建与多列相结合的数据框列的主要内容,如果未能解决你的问题,请参考以下文章