【问题标题】:How to combine multiple rows into a single row with python pandas based on the values of multiple columns?python - 如何根据多列的值将多行组合成一行?
【发布时间】:2019-01-24 19:57:35
【问题描述】:

我需要将多行合并为一行,原始数据框如下所示:

IndividualID    DayID    TripID    JourSequence   TripPurpose
200100000001    1        1         1              3
200100000001    1        2         2              31
200100000001    1        3         3              23
200100000001    1        4         4              5
200100000009    1        55        1              3
200100000009    1        56        2              12
200100000009    1        57        3              4
200100000009    1        58        4              6
200100000009    1        59        5              19
200100000009    1        60        6              2

我试图建立某种“旅行链”,所以基本上一个人在一天内的所有旅行顺序和旅行目的都应该在同一行...

理想情况下,我试图将表格转换为如下形式:

IndividualID    DayID     Seq1   TripPurp1     Seq2   TripPur2     Seq3   TripPurp3     Seq4   TripPur4
200100000001    1         1      3             2      31           3       23           4      5
200100000009    1         1      3             2      12           3        4           4      6

如果这不可行,那么以下模式也可以:

IndividualID    DayID      TripPurposes
200100000001    1          3, 31, 23, 5
200100000009    1          3, 12, 4, 6

有没有可能的解决方案?我在考虑 for loop/while 语句,但也许这不是一个好主意。 提前致谢!

【问题讨论】:

  • 不同 ID 的行数不同。你想如何处理缺失/额外的列? @McRist 不是骗子。
  • 我会检查个人的最大序列数...希望不超过 10 个序列...对于那些少于 10 个序列的人,是否可以将其留空?跨度>
  • 没有“空白”之类的东西。它必须是 NaN、空字符串或其他。
  • 对不起,我没有说清楚。 'NaN' 会很好。

标签: python pandas


【解决方案1】:

要获得第二个输出,您只需要分组并应用列表:

df.groupby(['IndividualID', 'DayID'])['TripPurpose'].apply(list)

                      TripPurpose
IndividualID  DayID 
200100000001    1   [3, 31, 23, 5]
200100000009    1   [3, 12, 4, 6, 19, 2]

要获得第一个输出,您可以执行以下操作(可能不是最好的方法):

df2 = pd.DataFrame(df.groupby(['IndividualID', 'DayID'])['TripPurpose'].apply(list))
trip = df2['TripPurpose'].apply(pd.Series).rename(columns = lambda x: 'TripPurpose'+ str(x+1))
df3 = pd.DataFrame(df.groupby(['IndividualID', 'DayID'])['JourSequence'].apply(list))
seq = df3['JourSequence'].apply(pd.Series).rename(columns = lambda x: 'seq'+ str(x+1))
pd.merge(trip,seq,on=['IndividualID','DayID'])

输出未排序

【讨论】:

    【解决方案2】:

    你可以试试:

    df_out = df.set_index(['IndividualID','DayID',df.groupby(['IndividualID','DayID']).cumcount()+1]).unstack().sort_index(level=1, axis=1)
    df_out.columns = df_out.columns.map('{0[0]}_{0[1]}'.format)
    df_out.reset_index()
    

    输出:

       IndividualID  DayID  JourSequence_1  TripID_1  TripPurpose_1  \
    0  200100000001      1             1.0       1.0            3.0   
    1  200100000009      1             1.0      55.0            3.0   
    
       JourSequence_2  TripID_2  TripPurpose_2  JourSequence_3  TripID_3  \
    0             2.0       2.0           31.0             3.0       3.0   
    1             2.0      56.0           12.0             3.0      57.0   
    
       TripPurpose_3  JourSequence_4  TripID_4  TripPurpose_4  JourSequence_5  \
    0           23.0             4.0       4.0            5.0             NaN   
    1            4.0             4.0      58.0            6.0             5.0   
    
       TripID_5  TripPurpose_5  JourSequence_6  TripID_6  TripPurpose_6  
    0       NaN            NaN             NaN       NaN            NaN  
    1      59.0           19.0             6.0      60.0            2.0  
    

    【讨论】:

      猜你喜欢
      • 2022-01-13
      • 1970-01-01
      • 1970-01-01
      • 2020-04-19
      • 1970-01-01
      • 1970-01-01
      • 2021-10-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多