【发布时间】:2021-06-15 13:11:53
【问题描述】:
我有一个由 BOW 结果组成的数据框,名为 df_BOW
数据框看起来像这样
df_BOW
Out[42]:
blue drama this ... book mask
0 3 0 1 ... 1 0
1 0 1 0 ... 0 4
2 0 1 3 ... 6 0
3 6 0 0 ... 1 0
4 7 2 0 ... 0 0
... ... ... ... ... ... ...
81991 0 0 0 ... 0 1
81992 0 0 0 ... 0 1
81993 3 3 5 ... 4 1
81994 4 0 0 ... 0 0
81995 0 1 0 ... 9 2
这个数据框有大约 12,000 列和 82,000 行
我想通过这样做来减少列数
对于每一行,只保留前 3 列,其他所有内容为 0
所以对于第 543 行(原始记录是这样的)
blue drama this ... book mask
543 1 11 21 ... 7 4
应该变成这个样子
blue drama this ... book mask
543 0 11 21 ... 7 0
仅保留前 3 列(戏剧、本、书)所有其他列都变为零
blue drama this ... book mask
929 5 3 2 ... 4 3
会变成
blue drama this ... book mask
929 5 3 0 ... 4 0
最后我应该删除所有行的所有列为零
我开始让这个函数循环所有行和所有列
for i in range(0, len(df_BOW.index)):
Col1No = 0
Col1Val = 0
Col2No = 0
Col2Val = 0
Col3No = 0
Col3Val = 0
for j in range(0, len(df_BOW.columns)):
if (df_BOW.iloc[i,j] > min(Col1Val, Col2Val, Col3Val)):
if (Col1Val <= Col2Val) & (Col1Val <= Col3Val):
df_BOW.iloc[i,Col1No] = 0
Col1Val = df_BOW.iloc[i,j]
Col1No = j
elif (Col2Val <= Col1Val) & (Col2Val <= Col3Val):
df_BOW.iloc[i,Col2No] = 0
Col2Val = df_BOW.iloc[i,j]
Col2No = j
elif (Col3Val <= Col1Val) & (Col3Val <= Col2Val):
df_BOW.iloc[i,Col3No] = 0
Col3Val = df_BOW.iloc[i,j]
Col3No = j
我不认为这个循环是最好的方法。
此外,使用此循环将无法处理前 50 列。
有没有更好的方法来做到这一点?
【问题讨论】: