【问题标题】:Loading columns into multiple DataFrames based on prefix根据前缀将列加载到多个 DataFrame
【发布时间】:2018-12-03 10:24:35
【问题描述】:

我想将具有特定前缀的列加载到单独的 DataFrame 中。

我想要的列有特定的前缀,即

   A_1 A_2 B_1 B_2 C_1 C_2
   1   0   0   0   0   0
   1   0   0   1   1   1
   0   1   1   1   1   0

我有一个所有前缀的列表:

prefixes = ["A", "B", "C"]

我想做这样的事情:

for prefix in prefixes:
    f"df_{prefix}" = pd.read_csv("my_file.csv",
                                 usecols=[f"{prefix}_1,
                                          f"{prefix}_2,
                                          f"{prefix}_3,])

所以每个 DataFrame 在名称中都有前缀,但我不太确定执行此操作的最佳方法或所需的语法。

【问题讨论】:

    标签: python pandas csv dataframe


    【解决方案1】:

    您可以尝试不同的方法。加载一次完整的 csv。通过删除列不要匹配您的前缀,从中创建三个 dfs。

    x = pd.read_csv("my_file.csv")
    notA = [c for c in x.columns if 'A' not in c]
    notB = [c for c in x.columns if 'B' not in c]
    notC = [c for c in x.columns if 'C' not in c]
    a = x.drop(notA,1)
    b = x.drop(notB,1)
    c = x.drop(notC,1)
    

    【讨论】:

      【解决方案2】:

      考虑到你有一个像这样的大数据框:

      In [1341]: df
      Out[1341]: 
         A_1  A_2  B_1  B_2  C_1  C_2
      0    1    0    0    0    0    0
      1    1    0    0    1    1    1
      2    0    1    1    1    1    0
      

      有一个主前缀列表:

      In [1374]: master_list = ['A','B','C']
      

      创建一个空字典来保存数据帧的多个子集:

      In [1377]: dct = {}
      

      遍历主列表并将列名存储在上面的dict中:

      In [1378]: for i in master_list:
            ...:     dct['{}_list'.format(i)] = [e for e in df.columns if e.startswith('{}'.format(i))]
      

      现在,dct 具有以下带有值的键:

      A_list : ['A_1', 'A_2']
      B_list : ['B_1', 'B_2']
      C_list : ['C_1', 'C_2']
      

      然后,像下面这样子集您的数据框:

      In [1381]: for k in dct:
            ...:     dct[k] = df[dct[k]]
      

      现在,字典对每个键都有实际的数据帧行:

      In [1384]: for k in dct:
            ...:     print dct[k]
      
      In [1347]: df_A
      Out[1347]: 
         A_1  A_2
      0    1    0
      1    1    0
      2    0    1
      
      In [1350]: df_B
      Out[1350]: 
         B_1  B_2
      0    0    0
      1    0    1
      2    1    1
      
      In [1355]: df_C
      Out[1355]: 
         C_1  C_2
      0    0    0
      1    1    1
      2    1    0
      

      【讨论】:

      • 感谢您的回答,问题是有数百个前缀,所以我只是想拥有一个主前缀列表并遍历该列表,而不是为每个前缀编写单独的行.
      【解决方案3】:

      首先用startswithboolean indexingloc 过滤掉不匹配的列,因为过滤列:

      print (df)
         A_1  A_2  B_1  B_2  C_1  D_2
      0    1    0    0    0    0    0
      1    1    0    0    1    1    1
      2    0    1    1    1    1    0
      
      prefixes = ["A", "B", "C"]
      df = df.loc[:, df.columns.str.startswith(tuple(prefixes))]
      print (df)
         A_1  A_2  B_1  B_2  C_1
      0    1    0    0    0    0
      1    1    0    0    1    1
      2    0    1    1    1    1
      

      然后通过split 创建Multiindex,然后使用groupby 创建字典,用于DataFrames 的字典:

      df.columns = df.columns.str.split('_', expand=True)
      print (df)
      
         A     B     C
         1  2  1  2  1
      0  1  0  0  0  0
      1  1  0  0  1  1
      2  0  1  1  1  1
      
      d = {k: v[k] for k, v in df.groupby(level=0, axis=1)}
      print (d['A'])
         1  2
      0  1  0
      1  1  0
      2  0  1
      

      或者使用带有split的lambda函数:

      d = {k: v for k, v in df.groupby(lambda x: x.split('_')[0], axis=1)}
      print (d['A'])
         A_1  A_2
      0    1    0
      1    1    0
      2    0    1
      

      【讨论】:

        猜你喜欢
        • 2018-09-10
        • 1970-01-01
        • 1970-01-01
        • 2021-04-19
        • 1970-01-01
        • 1970-01-01
        • 2018-04-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多