【问题标题】:Merge rows with same id, different vallues in 1 column to multiple columns将1列中具有相同id、不同值的行合并到多列
【发布时间】:2021-07-16 22:46:56
【问题描述】:

what i have 长度可以是不同的值/所以有些人 1 id 在列 val 中有 4 行具有不同值,其他列具有所有相同的值

df1 = pd.DataFrame({'id':[1,1,1,2,2,2,3,3,3], 'val': ['06123','nick','@gmail','06454','abey','@gmail','06888','sisi'], 'media': ['nrc','nrc','nrc','nrc','nrc','nrc','nrc','nrc']})

what i need

id    kolom 1     kolom2   kolom 3   media
1     06123       nick     @gmail    nrc
2     06454       abey     @gmail    nrc
3     6888        sisi     None      nrc

希望我举了一个很好的例子,用正确的方式,谢谢你的帮助

【问题讨论】:

    标签: pandas merge multiple-columns rows


    【解决方案1】:
    df2 = df1.groupby('id').agg(list)
    df2['col 1'] = df2['val'].apply(lambda x: x[0] if len(x) > 0 else 'None')
    df2['col 2'] = df2['val'].apply(lambda x: x[1] if len(x) > 1 else 'None')
    df2['col 3'] = df2['val'].apply(lambda x: x[2] if len(x) > 2 else 'None')
    df2['media'] = df2['media'].apply(lambda x: x[0] if len(x) > 0 else 'None')
    df2.drop(columns='val')
    

    【讨论】:

      【解决方案2】:

      这是另一种方式。由于您的原始数据框没有相同长度的列表(这将为您提供ValueError,您可以将其定义为:

      data = {"id":[1,1,1,2,2,2,3,3,3], 
              "val": ["06123","nick","@gmail","06454","abey","@gmail","06888","sisi"], 
              "media": ["nrc","nrc","nrc","nrc","nrc","nrc","nrc","nrc"]}
      df = pd.DataFrame.from_dict(data, orient="index")
      df = df.transpose()
      
      >>> df
          id     val media
          0    1   06123   nrc
          1    1    nick   nrc
          2    1  @gmail   nrc
          3    2   06454   nrc
          4    2    abey   nrc
          5    2  @gmail   nrc
          6    3   06888   nrc
          7    3    sisi   nrc
          8    3     NaN   NaN
      

      之后,您可以将np.nan 值替换为空字符串,这样您就可以groupby 您的id 列并将val 中的值以, 分隔。

      df = df.replace(np.nan, "", regex=True)
      df_new = df.groupby(["id"])["val"].apply(lambda x: ",".join(x)).reset_index()
      
      >>> df_new
              id                val
          0  1.0  06123,nick,@gmail
          1  2.0  06454,abey,@gmail
          2  3.0        06888,sisi,
      

      然后,您只需将新的val 列拆分为 3 列,将其中的字符串拆分为您想要的任何方法。例如,

      new_cols = df_new["val"].str.split(",", expand=True) # Good ol' split
      
      df_new["kolom 1"] = new_cols[0] # Assign to new columns
      df_new["kolom 2"] = new_cols[1]
      df_new["kolom 3"] = new_cols[2]
      df_new.drop("val", 1, inplace=True) # Delete previous val
      
      df_new["media"] = "nrc" # Add the media column again
      df_new = df_new.replace("", np.nan, regex=True) # If necessary, replace empty string with np.nan
      
      >>> df_new
              id kolom 1 kolom 2 kolom 3 media
          0  1.0   06123    nick  @gmail   nrc
          1  2.0   06454    abey  @gmail   nrc
          2  3.0   06888    sisi     NaN   nrc
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-12-13
        • 2022-01-26
        • 2020-12-23
        • 1970-01-01
        • 1970-01-01
        • 2020-05-13
        • 1970-01-01
        相关资源
        最近更新 更多