我想将具有特定前缀的列加载到单独的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的名称中都有前缀,但是我不确定执行此操作的最佳方法或所需的语法。
答案 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)
首先过滤掉与startswith
和boolean indexing
和loc
不匹配的列,因为过滤列:
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