实际数据:
ID Name Count
ss ih 5
tq gg 5
xy ab 5
st gh 4
yz ab 4
xv ab 4
xy bc 3
yz rs 3
xy cd 2
xv cd 2
xv mn 1
zq jk 1
输入:我有一个包含大量数据的数据框。在对 Name("ab") 进行过滤后,我们从整个数据中得到这个数据框,例如:
ID Name Count
xy ab 5
yz ab 4
xv ab 4
现在使用上面的 ID 过滤整个数据集文件,我们得到
ID Name Count
xy ab 5
xy bc 3
xy cd 2
ID Name Count
yz bc 5
yz ab 4
yz rs 3
ID Name Count
xv ab 4
xv cd 2
xv mn 1
所需的输出:我只想将我们得到的所有 3 个数据帧合并到第一个 ID 中并添加计数
ID Name Count
xy ab 13
xy bc 8
xy cd 4
xy rs 3
xy mn 1
代码:我知道代码但不知道如何在这里实现它。
merge: df=pd.merge(df_1,df_2, how="outer", on=["Name"])
count : df['Count'] = df.loc(df['Count'].value_counts())
Imp point: 我刚刚以“ab”作为第一个过滤器为例。我想用所有“名称”值来做。我们只是在每次迭代中删除其余的 ID(yz 和 xv)。
答案 0 :(得分:2)
来自您的DataFrame
:
>>> import pandas as pd
>>> from io import StringIO
>>> df = pd.read_csv(StringIO("""
... ID,Name,Count
... ss,ih,5
... tq,gg,5
... xy,ab,5
... st,gh,4
... yz,ab,4
... xv,ab,4
... xy,bc,3
... yz,rs,3
... xy,cd,2
... xv,cd,2
... xv,mn,1
... xv,ab,1
... zq,jk,1"""))
>>> df
ID Name Count
0 ss ih 5
1 tq gg 5
2 xy ab 5
3 st gh 4
4 yz ab 4
5 xv ab 4
6 xy bc 3
7 yz rs 3
8 xy cd 2
9 xv cd 2
10 xv mn 1
11 xv ab 1
12 zq jk 1
首先,我们可以保存在 serie
上过滤的 ab
:
>>> serie_name_filtered = df[df['Name']=='ab']['ID'].reset_index(drop=True)
>>> serie_name_filtered
0 xy
1 yz
2 xv
3 xv
Name: ID, dtype: object
然后,我们从上面的 DataFrame
中过滤 ID
上的整个 serie
:
>>> df_filtered = df[df['ID'].isin(serie_name_filtered)]
>>> df_filtered
ID Name Count
2 xy ab 5
4 yz ab 4
5 xv ab 4
6 xy bc 3
7 yz rs 3
8 xy cd 2
9 xv cd 2
10 xv mn 1
11 xv ab 1
下一步,我们使用 groupby
来获取 sum
列的 Count
,如下所示:
>>> df_grouped = df_filtered.groupby('Name')['Count'].sum().to_frame().reset_index(drop=False)
>>> df_grouped
Name Count
0 ab 14
1 bc 3
2 cd 4
3 mn 1
4 rs 3
最后,我们可以添加带有第一个 ID
的 ID
列serie_name_filtered
以获得预期的结果:
>>> df_grouped['ID'] = serie_name_filtered[0]
>>> df_grouped[['ID', 'Name', 'Count']]
ID Name Count
0 xy ab 14
1 xy bc 3
2 xy cd 4
3 xy mn 1
4 xy rs 3
要对 Name
中的所有名称执行此操作并将结果保存在 dict
中:
>>> def my_function(name):
... serie_name_filtered = df[df['Name']==name]['ID'].reset_index(drop=True)
... df_filtered = df[df['ID'].isin(serie_name_filtered)]
... df_grouped = df_filtered.groupby('Name')['Count'].sum().to_frame().reset_index(drop=False)
... df_grouped['ID'] = serie_name_filtered[0]
... return df_grouped[['ID', 'Name', 'Count']]
>>> result = {}
>>> for name in df['Name'].unique():
... result[name] = my_function(name)
>>> result
{'ih': ID Name Count
0 ss ih 5,
'gg': ID Name Count
0 tq gg 5,
'ab': ID Name Count
0 xy ab 14
1 xy bc 3
2 xy cd 4
3 xy mn 1
4 xy rs 3,
'gh': ID Name Count
0 st gh 4,
'bc': ID Name Count
0 xy ab 5
1 xy bc 3
2 xy cd 2,
'rs': ID Name Count
0 yz ab 4
1 yz rs 3,
'cd': ID Name Count
0 xy ab 10
1 xy bc 3
2 xy cd 4
3 xy mn 1,
'mn': ID Name Count
0 xv ab 5
1 xv cd 2
2 xv mn 1,
'jk': ID Name Count
0 zq jk 1}
答案 1 :(得分:0)
这是我的建议:
s=set(df.loc[df.Name.eq('ab'), 'ID'])
res = df[df.ID.isin(s)].groupby('Name')['Count'].sum().reset_index()
res['ID']='xy'
res=res[['ID', 'Name', 'Count']]
>>> print(res)
ID Name Count
0 xy ab 14
1 xy bc 3
2 xy cd 4
3 xy mn 1
4 xy rs 3