Python Pandas-创建类似于pd.get_假人的多个列
假设我的数据如下所示:Python Pandas-创建类似于pd.get_假人的多个列,python,pandas,dataframe,Python,Pandas,Dataframe,假设我的数据如下所示: df = pd.DataFrame({'color': ['red', 'blue', 'green', 'red', 'blue', 'blue'], 'line': ['sunday', 'sunday', 'monday', 'monday', 'monday', 'tuesday'], 'group': ['1', '1', '2', '1', '1', '1'], 'value': ['a', 'b', 'a', 'c', 'a',
df = pd.DataFrame({'color': ['red', 'blue', 'green', 'red', 'blue', 'blue'], 'line': ['sunday', 'sunday', 'monday', 'monday', 'monday', 'tuesday'],
'group': ['1', '1', '2', '1', '1', '1'], 'value': ['a', 'b', 'a', 'c', 'a', 'b']})
color group line value
0 red 1 sunday a
1 blue 1 sunday b
2 green 2 monday a
3 red 1 monday c
4 blue 1 monday a
5 blue 1 tuesday b
color line_1 line_1_value line_2 line_2_value line_3 line_3_value
0 red sunday a monday c tuesday not eligible
1 blue sunday b monday a tuesday b
2 green monday c
本质上,我想要的是得到每种颜色的线条列表。例如,我希望红色在其自己的列中显示与之关联的每一行和值。诀窍是,我还想显示与来自同一组的颜色相关联的其他线条。这些的相应值将为“不合格”。因此,我希望我的输出如下所示:
df = pd.DataFrame({'color': ['red', 'blue', 'green', 'red', 'blue', 'blue'], 'line': ['sunday', 'sunday', 'monday', 'monday', 'monday', 'tuesday'],
'group': ['1', '1', '2', '1', '1', '1'], 'value': ['a', 'b', 'a', 'c', 'a', 'b']})
color group line value
0 red 1 sunday a
1 blue 1 sunday b
2 green 2 monday a
3 red 1 monday c
4 blue 1 monday a
5 blue 1 tuesday b
color line_1 line_1_value line_2 line_2_value line_3 line_3_value
0 red sunday a monday c tuesday not eligible
1 blue sunday b monday a tuesday b
2 green monday c
有大约50000种独特的“颜色”,我需要这样做。我相信这是一件相对简单的事情,但我还不具备解决这个问题的知识或技能。任何帮助都将不胜感激 删除不需要的列,然后添加一列以获得每种颜色的唯一子索引:
df = df.drop('group', axis=1)
df['index_by_color'] = df.groupby('color').cumcount()
color line value index_by_color
0 red sunday a 0
1 blue sunday b 0
2 green monday a 0
3 red monday c 1
4 blue monday a 1
5 blue tuesday b 2
用于获取所需数据的方向:
df.pivot_table(index='color', columns=['index_by_color'], aggfunc=lambda x:x.iloc[0])
line value
index_by_color 0 1 2 0 1 2
color
blue sunday monday tuesday b a b
green monday None None a None None
red sunday monday None a c None
关于aggfunc=lambda x:x.iloc[0]的事情是将非数字数据透视数据减少为一个特定值,并且根据数据结构的唯一性,子帧的第一个元素就足够了
重新排列列层次索引:
res = res.sort_index(axis=1, level=1)
line value line value line value
index_by_color 0 0 1 1 2 2
color
blue sunday b monday a tuesday b
green monday a None None None None
red sunday a monday c None None
根据您需要的确切表示形式,剩下的部分是琐碎的清理,如
cumcount()+1
如果您需要从1开始编号而不是从0开始,请根据需要写入/展平列名res.columns=[''''.'.join([l0,str(l1)],对于l0,l1在res.columns]
或等效项,等等。考虑在两个具有列名处理的数据透视dfs上进行合并:
df['count'] = df.groupby('color').cumcount() + 1
pvt1 = df.pivot(columns='count', index='color', values='line').reset_index().fillna('')
pvt1.columns = ['color'] + ['line_'+str(c) for c in pvt1.columns[1:]]
pvt2 = df.pivot(columns='count', index='color', values='value').reset_index().fillna('')
pvt2.columns = ['color'] + ['line_'+str(c)+'_value' for c in pvt2.columns[1:]]
pvtdf = pd.merge(pvt1, pvt2, on=['color'])
pvtdf = pvtdf[[c for c in sorted(pvtdf.columns)]]
# color line_1 line_1_value line_2 line_2_value line_3 line_3_value
# 0 blue sunday b monday a tuesday b
# 1 green monday a
# 2 red sunday a monday c
这是接近我所寻找的;但是,它不考虑与组中其他颜色关联的线。所以“红色”的第3行应该显示为星期二,相应的值应该显示为“不合格”。这接近于我所寻找的;但是,它不考虑与组中其他颜色关联的线。因此,“红色”的第_2行应显示为星期二,相应的值应显示为“不合格”,第一步修改数据帧,在每个组的值列中添加“不合格”,然后删除组并继续上面的算法。关键的想法是在应用pivot之前准备好数据帧,其中包含所有需要的内容。你看到这里的逻辑了吗?我能够想出如何将附加记录添加到数据帧的末尾。为了将来的目的,将其全部集成到一个函数中。谢谢你的帮助!