【问题标题】:Merge value_counts of different pandas dataframes合并不同 pandas 数据帧的 value_counts
【发布时间】:2021-10-12 19:42:30
【问题描述】:

我有一个 pandas 数据框列表,我在其中对列的 value_counts 进行操作,最后将所有结果附加到另一个数据框。

df_AB = pd.read_pickle('df_AB.pkl')
df_AC = pd.read_pickle('df_AC.pkl')
df_AD = pd.read_pickle('df_AD.pkl')
df_AE = pd.read_pickle('df_AE.pkl')
df_AF = pd.read_pickle('df_AF.pkl')
df_AG = pd.read_pickle('df_AG.pkl')

上述数据帧的格式如下(示例:df_AB):

df_AB:
id   is_valid
121  True
122  False
123  True

对于每个 pandas 数据帧,我需要获取 is_valid 列的 value_counts 并将结果存储到 df_result。我尝试了下面的代码,但似乎没有按预期工作。

df_AB_VC = df_AB['is_valid'].value_counts() 
df_AB_VC['group'] = "AB"
df_AC_VC = df_AC['is_valid'].value_counts()
df_AC_VC['group'] = "AC"

结果数据框(df_result):

Group   is_valid_True_Count    is_Valid_False_Count
AB        2                      1
AC   
AD
 .
 .
 .

任何线索将不胜感激

【问题讨论】:

    标签: pandas dataframe merge


    【解决方案1】:

    我认为您只需要更系统地处理数据帧:

    groups = ['AB', 'AC', 'AD',...]
    
    out = pd.DataFrame({
        g: pd.read_pickle(f'df_{g}.pkl')['is_valid'].value_counts()
        for g in groups
    }).T
    

    【讨论】:

      【解决方案2】:

      不要使用变量,这会使您的代码更加复杂。 使用容器

      files = ['df_AB.pkl', 'df_AC.pkl', 'df_AD.pkl', 'df_AE.pkl', 'df_AF.pkl']
      
      # using the XX part in "df_XX.pkl", you need to adapt to your real use-case
      dataframes = {f[3:5]: pd.read_pickle(f) for f in files}
      
      # compute counts
      counts = (pd.DataFrame({k: d['is_valid'].value_counts()
                              for k,d in dataframes.items()})
                  .T.add_prefix('is_valid_').add_suffix('_Count')
                )
      

      示例输出:

          is_valid_True_Count  is_valid_False_Count
      AB                    2                     1
      AC                    2                     1
      

      【讨论】:

        【解决方案3】:

        使用pathlib 提取组名,然后在连接所有条目之前将数据收集到字典中:

        import pandas as pd
        import pathlib
        
        data = {}
        for pkl in pathlib.Path().glob('df_*.pkl'):
            group = pkl.stem.split('_')[1]
            df = pd.read_pickle(pkl)
            data[group] = df['is_valid'].value_counts() \
                                        .add_prefix('is_valid_') \
                                        .add_suffix('_Count')
        df = pd.concat(data, axis=1).T
        
        >>> df
            is_valid_True_Count  is_valid_False_Count
        AD                    2                     1
        AB                    4                     2
        AC                    0                     3
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-06-18
          • 1970-01-01
          • 2018-08-06
          • 2021-12-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多