【问题标题】:Append cell value in a df depending on a conditiontion根据条件在df中附加单元格值
【发布时间】:2021-07-11 04:15:23
【问题描述】:

我有一个像这样结构的数据框“New_data”

Index ID Content
0 001 abc
1 001 def
2 002 ghi
3 002 lmn
4 002 opq
5 003 rst
6 001 uvz

如您所见,“ID”列包含多个相等的 ID。我想创建一个附加列(“合并内容”),在每一行中,包含“ID”列中具有相同值的所有“内容”单元格的值。我想要这样的东西:

Index ID Content Merged content
0 001 abc abc def uvz
1 001 def abc def uvz
2 002 ghi ghi lmn opq
3 002 lmn ghi lmn opq
4 002 opq ghi lmn opq
5 003 rst rst
6 001 uvz abc def uvz

我尝试过使用 for 循环,但没有成功。 我已经创建了一个新的 df num ,其中 ID 列具有唯一值来迭代它们以及重复索引的问题,但我仍然无法解决我的问题。

这是我尝试应用的代码:

for i in range(len(num)):
    ID = num.iloc[i,0]
    for j in range(len(new_data)):
        ID_data = new_data.iloc[j,index]
        if ID == ID_data.iloc[j, 0]:
            new_data['Merged Content'] = new_data['Merged Content'].append(new_data['Content'])

我收到此错误: AttributeError: 'numpy.int64' object has no attribute 'iloc' 你能帮帮我吗?

【问题讨论】:

    标签: python dataframe for-loop


    【解决方案1】:

    我能想到的最简单的方法是在ID 上运行groupby,然后再次合并两个帧:

    import pandas as pd
    
    # df = pd.read_clipboard()
    
    merged_col = df.groupby("ID").agg(merged=pd.NamedAgg("Content", " ".join))
    res = df.merge(merged_col, how="left", on="ID")
    
    print(res)
    

    首先,我将原始数据帧按“ID”分组,我们" ".join作为聚合函数。这产生:

              merged
    ID              
    1    abc def uvz
    2    ghi lmn opq
    3            rst
    

    然后我将该表与ID上的原始表合并:

       Index  ID Content       merged
    0      0   1     abc  abc def uvz
    1      1   1     def  abc def uvz
    2      2   2     ghi  ghi lmn opq
    3      3   2     lmn  ghi lmn opq
    4      4   2     opq  ghi lmn opq
    5      5   3     rst          rst
    6      6   1     uvz  abc def uvz
    

    通常尽量避免对数据框中的所有记录运行循环。它们往往比作用于整个列的操作慢得多。原因是循环在常规 Python 中运行,查看每个元素,而列操作通常是使用 pandasnumpy 后面的库优化的代码。

    【讨论】:

    • 很好的解决方案!我没有考虑使用 groupby!实际上,由于原始数据集中的一些问题,我添加了将“内容”中的文本转换为 str ,然后它完美地工作了。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-10
    • 1970-01-01
    • 2021-05-21
    • 2016-04-14
    • 2021-09-11
    • 2021-08-01
    相关资源
    最近更新 更多