使用Pandas系列更新DataFrame行

时间:2019-12-11 13:11:50

标签: python dataframe

我目前正在研究一个问题,现在被困在执行其中一个步骤中。为了弥补可能性,我组成了以下示例,这是一个简单的场景。文本的长度可能很吓人,但这只是我试图更好地解释它。

这种简单的方案如下所示:我有一个查找表,其中存储了包含每种情况下最佳参数组合( df1 )的值。然后,我进行模拟以检查给定情况下查询表的参数是否更新,并将所有内容存储在 df2 上,然后提取返回最高结果的行。现在,我想要获取为参数1和2提取的最大值,然后针对该特定情况更新 df1 。所以请考虑:

import pandas as pd 
import numpy as np 
import random

np.random.seed(1)

a = np.linspace(0,10,11)
b = np.tile(0,11)
c = np.tile(0,11)

df1 = pd.DataFrame([a,b,c]).T
df1.columns = ['Situation','Parameter 1','Parameter 2']

d = np.tile(8,11)
e = abs(np.random.randn(11))
f = abs(np.random.randn(11))
g = abs(100*np.random.randn(11))
df2 = pd.DataFrame([d,e,f,g]).T
df2.columns = ['Situation', 'Parameter 1', 'Parameter 2', 'Outcome']

x = df2.loc[df2['Outcome'].idxmax()]     

起初,我的 df1 如下:

    Situation  Parameter 1  Parameter 2
0         0.0          0.0          0.0
1         1.0          0.0          0.0
2         2.0          0.0          0.0
3         3.0          0.0          0.0
4         4.0          0.0          0.0
5         5.0          0.0          0.0
6         6.0          0.0          0.0
7         7.0          0.0          0.0
8         8.0          0.0          0.0
9         9.0          0.0          0.0
10       10.0          0.0          0.0

对于 df2 的最大值,我将得到这样的系列:

Situation       8.000000
Parameter 1     2.301539
Parameter 2     0.172428
Outcome        93.576943

我想要的是 df1 看起来像这样:

    Situation  Parameter 1  Parameter 2
0         0.0          0.0          0.0
1         1.0          0.0          0.0
2         2.0          0.0          0.0
3         3.0          0.0          0.0
4         4.0          0.0          0.0
5         5.0          0.0          0.0
6         6.0          0.0          0.0
7         7.0          0.0          0.0
8         8.0       2.301539     0.172428
9         9.0          0.0          0.0
10       10.0          0.0          0.0

希望我能做到简洁明了,尽管解释的长度。非常感谢您在此方面的帮助!

2 个答案:

答案 0 :(得分:1)

在我看来,您的Situation列应为索引,我将执行以下操作:

df1 = df1.set_index('Situation')
df1.loc[df2.iloc[0], :] = df2.iloc[1:]

考虑到df2中的行顺序与您所描述的完全一样,这将满足您的要求。您的另一种选择是将df2变成类似df1的DF:

df2 = pd.DataFrame(df2).T.set_index('Situation')

然后您可以按索引进行分配:

df1.loc[df2.index[0], :] = df2.iloc[0, :]

答案 1 :(得分:1)

您可以替换为

  1. 删除相关行
  2. 在系列中添加不需要的“结果”
  3. 根据“情况”对DataFrame进行排序
  4. 重置索引

不确定是否确实需要3.和4.,但是对于Pandas来说,它仍然是单线的。

pod update