我正在研究的DF是这样的
co1 col2
A ['1','2','er']
A []
B ['1','3','4','abc']
B ['5']
C []
我想计算col2中的列表中每个元素在col1中的每个值的百分比。 i.ecalculate % of 1 for A, calculate % of 2 for A, calculate % of abc for BI我正在寻找一个解决方案来反复做这个。谅谅
输入数据的链接(爆炸前)----------------------------------------------【https:/drive.google.comfiled1fuOBo8PK1heAtfufBlplXXfh4FiLpBCDview?usp=sharing][1] 。
爆炸后的输出链接--【】。https:/drive.google.comfiled1mcArrsu3TWJC6hYZ2kIHAkAzCaHd1DLHview?usp=sharing][2] 。
我相信你需要 DataFrame.explode
与 DataFrame.dropna
:
#changed data for better sample
print (df)
col1 col2
0 A [1, 2, 1]
1 A []
2 B [3, abc, abc]
3 B [abc]
4 C []
df2 = df.explode('col2').dropna(subset=['col2'])
print (df2)
col1 col2
0 A 1
0 A 2
0 A 1
2 B 3
2 B abc
2 B abc
3 B abc
然后 SeriesGroupBy.value_counts
:
df2 = df2.groupby('col1')['col2'].value_counts(normalize=True).reset_index(name='%')
print (df2)
col1 col2 %
0 A 1 0.666667
1 A 2 0.333333
2 B abc 0.750000
3 B 3 0.250000
编辑:
import ast
df = pd.read_csv('beforeexplode.csv')
df['col2'] = df['col2'].apply(ast.literal_eval)
df2 = df.explode('col2').dropna(subset=['col2'])
print (df2)
col1 col2
0 dev1 android
1 dev1 android
2 dev3 oscp
2 dev3 gpen
2 dev3 ceh
.. ... ...
206 dev2 wcag
207 dev2 linux
207 dev2 unix
208 dev2 linux
208 dev2 unix
[460 rows x 2 columns]