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之前准备好数据帧,其中包含所有需要的内容。你看到这里的逻辑了吗?我能够想出如何将附加记录添加到数据帧的末尾。为了将来的目的,将其全部集成到一个函数中。谢谢你的帮助!