【问题标题】:Using .to_numpy() to copy specific columns from one row of Pandas Dataframe to another使用 .to_numpy() 将特定列从 Pandas Dataframe 的一行复制到另一行
【发布时间】:2020-03-23 00:15:55
【问题描述】:

我有一个这样的数据框:

     UniqueID  CST  WEIGHT  VOLUME  PRODUCTIVITY
0  413-20012    3     123      12          1113
1  413-45365    1     889      75          6748
2  413-21165    8     554      13          4536
3  413-24354    1     387      35          7649
4  413-34658    2     121      88          2468
5  413-36889    4     105      76          3336
6  413-23457    5     355      42          7894
7  413-30089    5     146      10          9112
8  413-41158    5     453      91          4545
9  413-51015    9     654      66          2232

而且我有一本关于 UniqueID 的父子映射的字典:

parent_child_dict = {
    '413-51015': '413-41158',
    '413-21165': '413-23457',
    '413-45365': '413-41158',
    '413-20012': '413-23457'
}

我需要做的是遍历数据框,并将“子”UniqueID 行的 WEIGHT、VOLUME 和 PRODUCTIVITY 值替换为“父”UniqueID 行中的值,生成的数据框如下所示:

     UniqueID  CST  WEIGHT  VOLUME  PRODUCTIVITY
0  413-20012    3     355      42          7894
1  413-45365    1     453      91          4545
2  413-21165    8     355      42          7894
3  413-24354    1     387      35          7649
4  413-34658    2     121      88          2468
5  413-36889    4     105      76          3336
6  413-23457    5     355      42          7894
7  413-30089    5     146      10          9112
8  413-41158    5     453      91          4545
9  413-51015    9     453      91          4545

我已经尝试了几种可能的解决方案,但我遇到的问题是限制复制,即保留“子”行的 UniqueID 和 CST 值,但复制其他值.

我得到的最接近的是字典循环,其中每个配对都被输入到这个:

df.loc[df['UniqueID'] == '413-51015'] = df.loc[df['UniqueID'] == '413-41158'].to_numpy()

这似乎很好地将所有值从一行替换到另一行。

任何有关例外情况的帮助或总体上更好的解决方案都将非常有帮助。谢谢。


编辑

我已将第一个解决方案循环到我想在数据集中更改的列中,如下所示:

columns = []
for col in df.columns:
    columns.append(col)
remove_perm = columns.remove('UniqueID')
remove_perm = columns.remove('CST')
print(columns)

输出

['WEIGHT', 'VOLUME', 'PRODUCTIVITY']

然后

for col in columns:
    s = df[['UniqueID', col]].set_index('UniqueID')
    df[col] = s.loc[df['UniqueID'].replace(parent_child_dict)].to_numpy()

这已经产生了所需的数据集。

【问题讨论】:

    标签: python pandas numpy


    【解决方案1】:

    replaceloc 访问:

    s = df[['UniqueID','PRODUCTIVITY']].set_index('UniqueID')
    
    # using to_numpy here :-)
    df['PRODUCTIVITY'] = s.loc[df['UniqueID'].replace(parent_child_dict)].to_numpy()
    

    输出:

        UniqueID  CST  WEIGHT  VOLUME  PRODUCTIVITY
    0  413-20012    3     123      12          7894
    1  413-45365    1     889      75          4545
    2  413-21165    8     554      13          7894
    3  413-24354    1     387      35          7649
    4  413-34658    2     121      88          2468
    5  413-36889    4     105      76          3336
    6  413-23457    5     355      42          7894
    7  413-30089    5     146      10          9112
    8  413-41158    5     453      91          4545
    9  413-51015    9     654      66          4545
    

    【讨论】:

    • 感谢您的额外帮助,这似乎已成功替换子行中的 PRODUCTIVITY 值,但没有更新 WEIGHT 和 VOLUME 值。在保留 UniqueID 和 CST 的同时替换所有这三个的最理想方法是什么?
    • 我已将您的建议输入到一个循环中,该循环一次执行一列(将在主帖中显示代码)。我怀疑有一种更有效的方法可以做到这一点,但据我所知,它正在处理真实的数据集并且运行速度非常快。
    【解决方案2】:

    首先从您的UniqueIDPRODUCTIVITY 创建一个映射。

    然后使用您的父子映射您的 id:

    mapping = df.set_index('UniqueID')['PRODUCTIVITY'].to_dict()
    df['PRODUCTIVITY'] = (
        df['UniqueID'].map(parent_child_dict).map(mapping).fillna(df['PRODUCTIVITY']).astype(int)
    )
    print(df)
        UniqueID  CST  WEIGHT  VOLUME  PRODUCTIVITY
    0  413-20012    3     123      12          7894
    1  413-45365    1     889      75          4545
    2  413-21165    8     554      13          7894
    3  413-24354    1     387      35          7649
    4  413-34658    2     121      88          2468
    5  413-36889    4     105      76          3336
    6  413-23457    5     355      42          7894
    7  413-30089    5     146      10          9112
    8  413-41158    5     453      91          4545
    9  413-51015    9     654      66          4545
    

    【讨论】:

    • 似乎导致与其他建议相同的行为,即成功替换 PRODUCTIVITY,但它没有更新 WEIGHT 和 VOLUME。想知道我是否错误地表达了这个问题,但目标是冻结 UniqueID 和 CST,并使用它们的“父”值更新所有“子”行中的 WEIGHT、VOLUME 和 PRODUCTIVITY。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-16
    • 2021-06-13
    • 2023-03-17
    相关资源
    最近更新 更多