折叠共享一列值的python数据帧行

时间:2018-03-20 18:37:08

标签: python pandas dataframe pivot

我觉得必须有一种非常直接的方法来做到这一点,但我无法找到它。

所以,我有这些数据(注意description列之间有共享部分):

import pandas as pd

data = {"description": ["AAAA:A", "AAAA:B", "AAAA:C", "AAAA:D", "BBBB:A", "BBBB:B"],
        "sequence": ["AAAAAAAAAAA", "AAAAAAABBBBBB", "AAAAAAAACCCCCCC", "AAAAAAAADDDDDDD",
                     "BBBBBBAAAAA", "BBBBBBBBBBBBB"]}

df = pd.DataFrame(data)
print df

#  description         sequence
#0      AAAA:A      AAAAAAAAAAA
#1      AAAA:B    AAAAAAABBBBBB
#2      AAAA:C  AAAAAAAACCCCCCC
#3      AAAA:D  AAAAAAAADDDDDDD
#4      BBBB:A      BBBBBBAAAAA
#5      BBBB:B    BBBBBBBBBBBBB

我的最终目标是将所有序列组合在一起,形成一个4字母的描述。像这样:

#  description   sequence_A     sequence_B       sequence_C       sequence_D
#0        AAAA  AAAAAAAAAAA  AAAAAAABBBBBB  AAAAAAAACCCCCCC  AAAAAAAADDDDDDD
#1        BBBB  BBBBBBAAAAA  BBBBBBBBBBBBB              NaN              NaN

直到现在,我已经达到了这一点:

df = df.apply(lambda row: pd.Series({"description": row["description"].split(":")[0],
                                     "sequence_{}".format(row["description"].split(":")[1]): row["sequence"]}),
              axis=1)
print df

#  description   sequence_A     sequence_B       sequence_C       sequence_D
#0        AAAA  AAAAAAAAAAA            NaN              NaN              NaN
#1        AAAA          NaN  AAAAAAABBBBBB              NaN              NaN
#2        AAAA          NaN            NaN  AAAAAAAACCCCCCC              NaN
#3        AAAA          NaN            NaN              NaN  AAAAAAAADDDDDDD
#4        BBBB  BBBBBBAAAAA            NaN              NaN              NaN
#5        BBBB          NaN  BBBBBBBBBBBBB              NaN              NaN

我猜测我需要df.groupby("description"),然后再向那里再迈一步,但我错过了最后一点。

2 个答案:

答案 0 :(得分:3)

pivot然后df[['New1','New2']]=df.description.str.split(':',expand=True) s=df[['New1','New2','sequence']] s.pivot(*s.columns).add_prefix('sequence_') Out[863]: New2 sequence_A sequence_B sequence_C sequence_D New1 AAAA AAAAAAAAAAA AAAAAAABBBBBB AAAAAAAACCCCCCC AAAAAAAADDDDDDD BBBB BBBBBBAAAAA BBBBBBBBBBBBB None None

{{1}}

答案 1 :(得分:3)

使用pivot

df[['description', 'seq']] = df['description'].str.split(':', expand = True)
df.pivot('description', 'seq', 'sequence').add_prefix('Sequence_')


seq     Sequence_A  Sequence_B      Sequence_C      Sequence_D
description             
AAAA    AAAAAAAAAAA AAAAAAABBBBBB   AAAAAAAACCCCCCC AAAAAAAADDDDDDD
BBBB    BBBBBBAAAAA BBBBBBBBBBBBB   None            None