我有两个DF,x和y。DF x包含一个group
变量和两个值变量val_1
和val_2
。对于x中的每组,我想根据DF y中的标准选择val_1
或val_2
。结果应该是一个新的DF z,其中有一个group
列和一个包含val_1
或val_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的每一行具有一一对应的关系。
希望能有所帮助!