根据组选择pd.DataFrame中的列,并由第二个DF中的标准定义



我有两个DF,x和y。DF x包含一个group变量和两个值变量val_1val_2。对于x中的每组,我想根据DF y中的标准选择val_1val_2。结果应该是一个新的DF z,其中有一个group列和一个包含val_1val_2值的单值列。

我有一个解决方案,但我是Python的新手,我想知道下面的代码是否可以更简洁。

import pandas as pd
import numpy as np
# define groups and number of observations
groups = ['a','b','c']
N_group = 5
L = len(groups)*N_group
# define DF x 
x = pd.DataFrame({'group': np.repeat(groups, N_group),
'val_1': np.random.uniform(size=L),
'val_2': np.random.uniform(low=10, high=20,size=L)})
# Criterum frame. For a particular group select either val_1 or val_2
y = pd.DataFrame({'group': groups,
'val_col' : ['val_1','val_2','val_1']})
# Using a for loop to subset x based on contents of each row in y.
# Could this be optimized?
z = []
for i, r in y.iterrows():
z.append(pd.DataFrame({'group': r[0],
'val': x.loc[x['group'] == r[0], r[1]]
}))
z = pd.concat(z)
print(z)
>>>
group        val
0      a   0.346833
1      a   0.575308
2      a   0.083667
3      a   0.878797
4      a   0.649935
5      b  17.904204
6      b  15.361618
7      b  15.837250
8      b  11.352091
9      b  11.390637
10     c   0.123949
11     c   0.022118
12     c   0.737024
13     c   0.230206
14     c   0.613382

您可以使用如下一行,它从数据帧x:返回选定的值

x.apply(lambda row: row[y[y["group"]==row["group"]]["val_col"].values[0]], axis=1)

完整的解决方案

import pandas as pd
import numpy as np
# define groups and number of observations
groups = ['a','b','c']
N_group = 5
L = len(groups)*N_group
# define DF x 
x = pd.DataFrame({'group': np.repeat(groups, N_group),
'val_1': np.random.uniform(size=L),
'val_2': np.random.uniform(low=10, high=20,size=L)})
# Citerum frame. For a particular group select either val_1 or val_2
y = pd.DataFrame({'group': groups,
'val_col' : ['val_1','val_2','val_1']})
# Using a for loop to subset x based on contents of each row in y.
# Could this be optimized?
z = []
for i, r in y.iterrows():
z.append(pd.DataFrame({'group': r[0],
'val': x.loc[x['group'] == r[0], r[1]]
}))
z = pd.concat(z)
print(z)
x["val"] = x.apply(lambda row: row[y[y["group"]==row["group"]]["val_col"].values[0]], axis=1)
print(x[["group", "val"]])

解释

y[y["group"]=="a"]返回熊猫数据帧:

group   val_col
----------------
a       val_1

由于数据帧y中存在唯一的group值,因此上述表达式总是返回一条记录。

y[y["group"]=="a"]["val_col"]返回列val_col的值作为熊猫系列:(val_1)。在这里,序列中只有一个值。

y[y["group"]=="a"]["val_col"].values将上述系列转换为numpy数组:["val_1"]

y[y["group"]=="a"]["val_col"].values[0]返回字符串值:"val_1"

CCD_ 18与CCD_。

apply()遍历数据帧x的每一行时,它对该行的上述表达式进行求值,并返回结果row["val_1"]row["val_2"]row["val_3"]值。

x["val"] = x.apply()将该返回值中的每一个附加到数据帧x中的新列val。列val与数据帧x的每一行具有一一对应的关系。

希望能有所帮助!

相关内容

  • 没有找到相关文章

最新更新