【问题标题】:how to write a function to filter rows based on a list values one by one and make analysis如何编写函数根据列表值逐一过滤行并进行分析
【发布时间】:2021-11-05 00:18:00
【问题描述】:

我有一个包含超过 10 个值的列表,并且我有一个完整的数据框。我想将列表中的每个值过滤到一个子数据框中,并对它们中的每一个进行一些分析。我怎样才能编写一个函数,这样我就不需要复制粘贴和更改值这么多次了。

例如。

list = ['A','B','C'] 
df1 = df[df['column1']=='A']
df2 = df[df['column1']=='B']
df3 = df[df['column1']=='C']

对于每个子数据帧,我会做一个 groupby 和 value count

df1.groupby(['column2']).size()
df2.groupby(['column2']).size()
df3.groupby(['column2']).size()

【问题讨论】:

  • 你想要3个python变量吗? df1, df2, df3?

标签: python pandas dataframe filter


【解决方案1】:

这里不需要首先使用许多 DataFrame。

您可以只过滤column1 的必要值并将两列都传递给groupby

L = ['A','B','C']

s = df1[df1['column1'].isin(L)].groupby(['column1', 'column2']).size()

最后选择列表的值:

s.loc['A']
s.loc['B']
s.loc['C']

如果想要功能:

def f(df, x):
    return df[df['column1'].eq(L)].groupby(['column2']).size()


print (f(df1, 'A'))

【讨论】:

    【解决方案2】:

    您可以使用locals() 动态创建变量(这不是一个很好的做法,但效果很好):

    df = pd.DataFrame({'column1': list('ABC') * 3, 'column2': list('IKJIJKLNK')})
    lst = ['A', 'B', 'C']
    
    for idx, elmt in enumerate(lst, 1):
        locals()[f"df{idx}"] = df[df['column1'] == elmt]
    
    >>> df3
      column1 column2
    2       C       J
    5       C       K
    8       C       K
    
    >>> df3.value_counts('column2')
      column1  column2
    column2
    K    2
    J    1
    dtype: int64
    
    >>> df
      column1 column2
    0       A       I
    1       B       K
    2       C       J
    3       A       I
    4       B       J
    5       C       K
    6       A       L
    7       B       N
    8       C       K
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-04-02
      • 1970-01-01
      • 2022-01-19
      • 1970-01-01
      • 2022-07-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多