Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用.to_numpy()将特定列从数据帧的一行复制到另一行_Python_Pandas_Numpy - Fatal编程技术网

Python 使用.to_numpy()将特定列从数据帧的一行复制到另一行

Python 使用.to_numpy()将特定列从数据帧的一行复制到另一行,python,pandas,numpy,Python,Pandas,Numpy,我有这样一个数据帧: 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 764

我有这样一个数据帧:

     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  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
columns = []
for col in df.columns:
    columns.append(col)
remove_perm = columns.remove('UniqueID')
remove_perm = columns.remove('CST')
print(columns)
我有一个UniqueID的父:子映射字典:

parent_child_dict = {
    '413-51015': '413-41158',
    '413-21165': '413-23457',
    '413-45365': '413-41158',
    '413-20012': '413-23457'
}
我需要做的是循环遍历数据帧,并用“父”UniqueID行的值替换“子”UniqueID行的重量、体积和生产率值,其中生成的数据帧如下所示:

     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  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
columns = []
for col in df.columns:
    columns.append(col)
remove_perm = columns.remove('UniqueID')
remove_perm = columns.remove('CST')
print(columns)
我已经尝试了几种可能的解决方案,我遇到的麻烦是限制复制的方式,即保留“child”行的UniqueID和CST值,但复制其他值

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

df.loc[df['UniqueID'] == '413-51015'] = df.loc[df['UniqueID'] == '413-41158'].to_numpy()
这似乎很好地将所有值从一行替换到另一行

对例外情况的任何帮助或更好的总体解决方案都将非常有用。多谢各位


编辑

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

     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  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
columns = []
for col in df.columns:
    columns.append(col)
remove_perm = columns.remove('UniqueID')
remove_perm = columns.remove('CST')
print(columns)
输出

['WEIGHT', 'VOLUME', 'PRODUCTIVITY']
然后


这就产生了所需的数据集。

首先从您的
UniqueID
生产力创建一个映射

然后使用您的父子代映射您的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

replace
loc
访问:

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

感谢额外的帮助,这似乎成功地替换了子行中的生产率值,但没有更新重量和体积值。在保留UniqueID和CST的同时替换这三个元素最理想的方法是什么?我已经将您的建议反馈到一个循环中,该循环一次只执行一列(将在主帖子中显示代码)。我怀疑有一种更有效的方法可以做到这一点,但从我所知,它正在处理真实的数据集,而且运行速度相当快。似乎会导致与其他建议相同的行为,即成功地取代生产力,但它没有更新重量和体积。我想知道我的问题措辞是否错误,但目标是冻结UniqueID和CST,并使用其“父”值更新所有“子”行中的重量、体积和生产率。