假设我有:
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
答案 0 :(得分:3)
replace
用与df1等效的数字df2值melt
数据框将其放入一列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
如果您的所有数据都不是float
或int
,则可以使用:
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匹配,使用map
和value_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)