如何将列值与另一个数据框中的行值匹配,每行有多个值?

时间:2020-11-10 01:17:19

标签: python pandas numpy dataframe

假设我有:

df1

index  name
0      bobby   
1      alex
2      timmy
3      dale
4      chadwick
5      dillon
6      jade

和df2:

index  vote1     vote2     vote3
0        2         3         1
1        1         4         3   
2        1         4         2
3        4         3         Nan
4        2         0         6

我想通过将df2中的索引值与行中调用的索引相匹配并求和来找出最受欢迎的人。

我现在被困住了。

我的预期输出是


Name         Votes
Chadwick      3
dale          3
alex          3
timmy         3
boby          1
jade          1
dillon        0

3 个答案:

答案 0 :(得分:3)

  1. 您可以replace用与df1等效的数字df2值
  2. 然后,melt数据框将其放入一列
  3. 获取该列的值计数
  4. 将其发送到数据框并进行清理

df2.replace(df1['name']).melt().iloc[:,-1].value_counts()
Out[1]: 
dale        3
alex        3
chadwick    3
timmy       3
jade        1
bobby       1
Name: value, dtype: int64

如果您的所有数据都不是floatint,则可以使用:

df2 = (df2.replace('Nan', np.nan).astype(float) #You had a 'Nan' string in your question, so you can remove ".replace('Nan', np.nan)"
          .replace(df1['name']).melt().iloc[:,-1].value_counts())

要使其成为数据框,您可以执行以下操作:

df2 = (df2.replace(df1['name'])
           .melt(value_name='Votes')
           .iloc[:,-1]
           .value_counts()
           .to_frame()
           .reset_index()
           .rename({'index' : 'Name'}, axis=1))
df2
Out[3]: 
       Name  Votes
0      dale      3
1      alex      3
2  chadwick      3
3     timmy      3
4     bobby      1
5      jade      1

答案 1 :(得分:1)

尝试:

df2 = df2.replace('Nan', np.nan).astype(str)
df1.index = df1.index.astype(str)
df2.stack().map(df1['name']).value_counts()

输出:

timmy       3
dale        3
chadwick    3
alex        3
bobby       1
jade        1
dtype: int64

使用stack,然后确保df1和df2的dtype匹配,使用mapvalue_counts

答案 2 :(得分:0)

m = df1.name.to_dict()
df3 = pd.DataFrame(index=df1.name.values)
df2.replace("Nan", -1).astype(int)
for col in df2.columns:
    df3[col] = df2[col].map(d).value_counts()

df3 = df3.sum(axis=1)