根据前缀将列加载到多个DataFrame中

时间:2018-12-03 10:24:36

标签: python pandas csv dataframe

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

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

   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的名称中都有前缀,但是我不确定执行此操作的最佳方法或所需的语法。

3 个答案:

答案 0 :(得分:0)

您可以尝试使用其他方法。一次加载完整的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)

答案 1 :(得分:0)

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

@GetMapping("/download_file")
public ResponseEntity<ByteArrayResource> downloadFile(@RequestParam("file_name") String fileName, Model model) {

    // Get the job's route url.
    String resourceUrl = ApiConfig.URL + "/" + ApiConfig.FILE_ROUTE  + "/" + fileName;

    // Create the request.
    ClientHttpRequestFactory requestFactory = new SimpleClientHttpRequestFactory();
    RestTemplate restTemplate = new RestTemplate(requestFactory);

    // Execute the request.
    return restTemplate.getForEntity(resourceUrl, ByteArrayResource.class);
}

有一个前缀主列表:

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

现在,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]]

答案 2 :(得分:0)

首先过滤掉与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

然后用Multiindex创建split,然后用groupby词典来说明DataFrame的判别:

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