在python中过滤数据帧、合并数据并添加计数

2024-05-19 11:30:30 发布

您现在位置:Python中文网/ 问答频道 /正文

实际数据:

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

输入:我有一个包含大量数据的数据框。在对名称(“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”作为第一个过滤器为例。我想用所有的“Name”值来做。我们只是在每次迭代中删除其余的ID(yz和xv)


Tags: 数据代码nameiddfabcountcd
2条回答

以下是我的建议:

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

从您的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

首先,我们可以保存在ab上筛选的serie

>>> 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

然后,我们从上面的serie中过滤ID上的整个DataFrame

>>> 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获取Count列的sum,如下所示:

>>> 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

最后,我们可以添加序列serie_name_filtered中第一个IDID列以获得预期结果:

>>> 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}

相关问题 更多 >

    热门问题