给出2个熊猫数据框
Med_DF
Key Med
1 A
1 B
1 C
2 A
2 F
3 A
3 C
3 E
4 A
4 B
4 C
4 D
Key_DF
Key ID
1 A1
2 A2
3 A3
4 A4
5 A5
如何合并没有重复的Keys
的两者,将ID
与每个Key
匹配,并在新列中创建派生变量?派生变量将返回每ID
或空白/ Nan
(如果为0)的药物数量,如下面的Result_DF所示
Result_DF
Key ID Med
1 A1 3
2 A2 2
3 A3 3
4 A4 4
5 A5
我尝试过的事情
我确定我的解决方案过时且效率低下,这就是为什么我要一个更清洁,可能更快的解决方案。尽管如此,我还是通过循环创建Excel公式来填充派生的列并查找与ID
相匹配的Key
。
# read in Med and Key files into dataframes
Med_DF = pd.read_csv(med_file, usecols = ['Key', 'Med'], encoding = 'utf-8', keep_default_na=False, na_values=[''])
Key_DF = pd.read_csv(key_file, usecols = ['Key', 'ID'], encoding = 'utf-8', keep_default_na=False, na_values=[''])
# add empty ID column to Med_DF
Med_DF.insert(0, "ID", "")
# assign length of dataframes
length_of_med = len(Med_DF)
length_of_key = len(Key_DF)
# create empty lists for formulas
med_countif = []
med_vlookup = []
# med VLOOKUP formulas
for i in range(2,length_of_med+2):
formula = '=VLOOKUP($B{0},Sheet1!$A:$B,2,FALSE)'.format(i)
med_vlookup.append(formula)
# med COUNTIF formulas
for i in range(2,length_of_key+2):
formula =
'=IF(COUNTIF(Sheet1!$A:$A,$B{0})=0,"",COUNTIF(Sheet1!$A:$A,$B{0}))'.format(i)
med_countif.append(formula)
# write formulas to columns
Key_DF.loc[:, "Meds"] = meds_formulas
Med_DF.loc[:, "Key"] = meds_vlookup
答案 0 :(得分:1)
使用join
和value_counts
或GroupBy.size
来计数值,因为至少有一个float
-不匹配的值,所以值被转换为NaN
s:
df = Key_DF.join(Med_DF['Key'].value_counts().rename('Med'), on='Key')
替代:
df = Key_DF.join(Med_DF.groupby('Key').size().rename('Med'), on='Key')
print (df)
Key ID Med
0 1 A1 3.0
1 2 A2 2.0
2 3 A3 3.0
3 4 A4 4.0
4 5 A5 NaN
答案 1 :(得分:0)
使用带有左外部联接的Key上的Key_DF
和Med_DF
合并熊猫。
结果为groupby
的{{1}}和Key, ID
个计数函数
Med
import pandas as pd
df = pd.merge(Key_DF,Med_DF[['Med','Key']],on='Key',how='left').groupby(["Key","ID"]).Med.agg({"Med":"count"})
在这里,我使用count时将第5行设为0。因此,如果需要获得Nan,我们可以再增加一个步骤以用Nan替换0
df
Key ID Med
1 A1 3
2 A2 2
3 A3 3
4 A4 4
5 A5 0