【问题标题】:Concatenating multiple cells based on changing cell value in same DataFrame根据同一DataFrame中更改单元格值连接多个单元格
【发布时间】:2020-05-21 21:33:41
【问题描述】:

我有一个大数据框,我正在尝试找出如何将具有不同值的单元格连接到一个单元格中,给定以下数据框:
DF1:以数据和名称作为标题

    Data,                          Name
    Address 213,                   Name1
    Household = 1,                 Name1
    1012 ..alpha numeric value..., Name1
    1013 ..alpha numeric value..., Name1
    1012 ..alpha num val2...       Name1
    1013 ..alpha num val2...       Name1
    Address 234,                   Name2
    Household = 2,                 Name2
    1012 ..alpha numeric value..., Name2
    1013 ..alpha numeric value..., Name2
    1012 ..alpha num val2...       Name2
    1013 ..alpha num val2...       Name2
    .......... dataframe repeats with different values for 10,000+ lines

1012 和 1013 是重复序列 X 次。 我想要得到的输出是:
DF输出:

    Data                                                                                      Name
    Address 213   Household = 1   1012 ..alpha numeric value.. 1013 ..alpha numeric value..., Name1
    Address 213   Household = 1   1012 ..alpha num val2...     1013 ..alpha num val2...,      Name1
    Address 234   Household = 2   1012 ..alpha numeric value.. 1013 ..alpha numeric value..., Name2
    Address 234   Household = 2   1012 ..alpha num val2...     1013 ..alpha num val2...,      Name2
    ..... repeats for entire dataframe 10,000+ lines in DF1

另外,DFOut 中Data 列中的单元格也可以分开:

    Data,         Number,         Seq,                          Seq1,                          Name
    Address 213,  Household = 1,  1012 ..alpha numeric value.., 1013 ..alpha numeric value..., Name1
    Address 213,  Household = 1,  1012 ..alpha num val2...,     1013 ..alpha num val2...,      Name1
    Address 234,  Household = 2,  1012 ..alpha numeric value.., 1013 ..alpha numeric value..., Name2
    Address 234,  Household = 2,  1012 ..alpha num val2...,     1013 ..alpha num val2...,      Name2
    ..... repeats for entire dataframe 10,000+ lines in DF1

我尝试使用几个for 循环根据值搜索Data 列,然后将不同的值连接到一列中,但这样做之后由于某种原因我丢失了Name 列。我对 Python 相当陌生,任何帮助将不胜感激。提前致谢!

【问题讨论】:

    标签: python python-3.x excel pandas csv


    【解决方案1】:

    您可以通过迭代和使用字符串连接来获得所需的输出。只需确保 Data 列是字符串类型即可。

    DF1["Data"] = DF1["Data"].astype('str') # Convert "Data" column to string type
    DF1_grouped = DF1.groupby("Name") # Create groups
    DFOut = DF1_grouped["Data"].sum() # Concatenate strings
    

    单线解决方案

    DFOut = DF1.groupby("Name")["Data"].sum()
    

    如果您想在每个 Data 值之后留一个空格,您可以在字符串转换之后和分组之前将其添加到列中。

    DF1["Data"] = DF1["Data"] + " " # Add space after each string
    

    【讨论】:

    • 嗨 Rookie,感谢您的输入,我更新了上面的问题,1012 和 1013 是具有不同值的重复序列。有没有办法可以按每行中的变化值进行分组?如果您需要更多说明,请告诉我。再次感谢。
    【解决方案2】:

    试试这个:

    dfgrp0 = df.groupby("Name")["Data"].apply(list).reset_index()
    
    dfgrp1 = dfgrp[['Data', 'Number', 'Seq1', 'Seq2']] = pd.DataFrame(dfgrp['Data'].to_list())
    

    输出:

    dfgrp0

    Name        Data
    0   Name1   [Address 213, Household = 1, 1012 ..alpha nume...
    1   Name2   [Address 234, Household = 2, 1012 ..alpha nume...
    

    dfgrp1

        Name    Data        Number          Seq1                       Seq2
    0   Name1   Address 213 Household = 1   1012 ..alpha numeric value  1013 ..alpha numeric value
    1   Name2   Address 234 Household = 2   1012 ..alpha numeric value  1013 ..alpha numeric value
    

    我不确定你的用例是什么——这可能需要一些调整,因为它对你的数据做出了一些假设——但如果你想要真正花哨的话:

    df['k'] = df['Data'].str.split(' ').map(lambda _: _[0])
    df['v'] = df['Data'].str.split(' ').map(lambda _: ' '.join(_[1:]).strip('='))
    
    df.drop('Data', axis=1, inplace=True)
    df_out = pd.pivot_table(df, index=["Name"], columns=["k"], values=["v"], aggfunc=np.sum)
    df_out
    

    输出:

        v
    k       1012                    1013                    Address Household
    Name                
    Name1   ..alpha numeric value   ..alpha numeric value   213     1
    Name2   ..alpha numeric value   ..alpha numeric value   234     2
    

    【讨论】:

    • 嗨,安迪,感谢您的意见!我在上面编辑了我的问题。我的问题是 1012 和 1013 是具有不同值的重复序列。有没有办法仅根据它们的值 1012、1013、地址等对单元格进行分组?再次感谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-27
    • 2018-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多