我试图根据数据框中列值的某些条件从pandas数据框中生成列表,我的df看起来像
df =
48 150 39 0
0 BE0974302342 0 0 21
1 BE0974302342 3 3 19
2 BE0974302342 F 2 2
3 FR0000073843 0 0 22
4 FR0000073843 3 3 20
5 FR0000073843 F 2 2
6 FR0000076861 0 0 21
7 FR0000076861 3 3 18
8 FR0000076861 F 1 3
9 FR0000076861 F 2 3
10 FR0000076887 0 0 13
11 FR0000076887 3 3 11
12 FR0000076887 8 8 19
13 FR0000076887 F 2 2
14 FR0000077562 0 0 22
15 FR0000077562 3 3 19
16 FR0000077562 F 2 3
17 FR0000079147 0 0 20
18 FR0000079147 3 3 16
19 FR0000079147 F 1 1
20 FR0000079147 F 2 4
21 FR0004034072 0 0 14
22 FR0004034072 3 3 12
23 FR0004034072 8 8 21
24 FR0004034072 F 2 2
25 FR0004152874 0 0 22
26 FR0004152874 3 3 20
27 FR0004152874 F 1 1
28 FR0004152874 F 2 2
29 FR0004178572 0 0 21
...
第150列和第39列的组合具有含义,因此我想根据该组合提取计数,共有6种可能的组合
150 39
0 0
3 3
4 4
8 8
F 1
F 2
我想形成一个final_list,其中将对列“ 48”中的每个值具有每种组合的计数,
例如
'BE0974302342', (150=0, 39=0) record count is 21, (150=3, 39=3) is 19, (150=4, 39=4) is 0, (150=8, 39=8) is 0, (150=F, 39=1) is 0, (150=F,39=2) is 2
所以最终记录列表将类似于
[[BE0974302342,21,19,0,0,0,2],
[FR0000073843,22,20,0,0,0,2],
[FR0000076861,21,18,0,0,1,3]...]
我尝试了什么:我尝试将df转换为列表,然后遍历每个子列表,并检查150和39值的组合,虽然部分有效,但我想有一个更好的解决方案,它将完美地工作,在此先感谢我为实现此目标而应采取的任何帮助或建议。
答案 0 :(得分:2)
使用crosstab
并将DataFrame转换为list
s:
df1 = pd.crosstab(df[48], [df[150], df[39]])
#alternative solutions
#df1 = df.groupby([48, 150, 39]).size().unstack(level=[1,2], fill_value=0)
#df1 = df.pivot_table(index=48, columns=[150, 39], aggfunc='size', fill_value=0)
print (df1)
150 0 3 8 F
39 0 3 8 1 2
48
BE0974302342 1 1 0 0 1
FR0000073843 1 1 0 0 1
FR0000076861 1 1 0 1 1
FR0000076887 1 1 1 0 1
FR0000077562 1 1 0 0 1
FR0000079147 1 1 0 1 1
FR0004034072 1 1 1 0 1
FR0004152874 1 1 0 1 1
FR0004178572 1 0 0 0 0
L = df1.reset_index().values.tolist()
print (L)
[['BE0974302342', 1, 1, 0, 0, 1],
['FR0000073843', 1, 1, 0, 0, 1],
['FR0000076861', 1, 1, 0, 1, 1],
['FR0000076887', 1, 1, 1, 0, 1],
['FR0000077562', 1, 1, 0, 0, 1],
['FR0000079147', 1, 1, 0, 1, 1],
['FR0004034072', 1, 1, 1, 0, 1],
['FR0004152874', 1, 1, 0, 1, 1],
['FR0004178572', 1, 0, 0, 0, 0]]
如果需要组合,将列中的MultiIndex
转换为元组列表:
print (df1.columns.tolist())
[('0', 0), ('3', 3), ('8', 8), ('F', 1), ('F', 2)]