我有一个11列乘17604列的数据框。当我更改群集时,行数可能会有所不同。
B42D2033/26 G02B27/2214 G02F1/133753 G02F1/133707 G02F1/1341 G02F1/1339 G02F1/133371 G02B6/005 C08G73/12 G02F1/1303 ... G06F17/30035 G06F21/629 B65B3/26 E04D13/00 G06F17/30952 G07C9/00912 F02C9/28 G06F17/28 G06F17/30964 G06F21/82
Cluster
C1 0.000000 1.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.000000 0.000000 0.000000 ... 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
C10 0.000000 3.250000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 ... 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
C11 0.020619 1.149485 0.262887 0.829897 0.551546 1.030928 0.082474 1.175258 0.005155 0.216495 ... 0.005155 0.010309 0.005155 0.005155 0.005155 0.005155 0.005155 0.005155 0.005155 0.005155
C2 0.000000 1.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 ... 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
C3 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 ... 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
C4 0.055556 13.500000 8.333333 24.555556 13.166667 26.666667 3.277778 4.222222 0.000000 2.388889 ... 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
C5 0.000000 0.750000 0.000000 0.000000 0.000000 0.500000 0.000000 0.250000 0.000000 0.000000 ... 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
C6 0.032258 3.451613 0.000000 0.000000 0.000000 0.387097 0.000000 0.064516 0.000000 0.000000 ... 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
C7 0.000000 0.000000 0.250000 0.000000 0.000000 0.250000 0.000000 0.000000 0.000000 1.500000 ... 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
C8 0.000000 0.076923 0.153846 0.346154 0.000000 0.884615 0.461538 0.192308 0.038462 0.076923 ... 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
C9 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 ... 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
我想根据列中的值为每个群集生成字典或系列。例如,可能会出现值!=0
的所有列,其字典形式为:
{'C1', ['G02B27/2214', 'G02F1/1339']}
如何为每个群集行的值等于“某个值”或一系列值的行生成一个序列?
我确实看过Select rows from a DataFrame based on values in a column in pandas,但该解决方案并不适用于一行中的所有列。
编辑:
我意识到我可以转置df
并执行类似的操作:
df_clusters.T[df_clusters.T['C1']>0]
哪一行返回的df
中'C1'大于0的每一行。我想我可以删除其他簇列,但是我认为这不是最佳解决方案。
答案 0 :(得分:2)
想法是为每个条件创建值的索引,然后创建新的DataFrame并按列表中的indices
获取列表,然后转换为dict
:
i, c = np.where(df > 0)
d = pd.DataFrame({'a':df.index[i], 'b':df.columns[i]}).groupby('a')['b'].apply(list).to_dict()
print (d)
另一种解决方案是使用DataFrame.stack
或DataFrame.melt
进行整形,通过boolean indexing
或DataFrame.query
进行过滤,最后使用ist
创建l dict
s个:
s = df.stack()
d = s[s > 0].reset_index().groupby('Cluster')['level_1'].apply(list).to_dict()
d = (df.reset_index()
.melt('Cluster', value_name='v1', var_name='v2')
.query('v1 > 0')
.groupby('Cluster')['v2']
.apply(list)
.to_dict())
答案 1 :(得分:0)
尝试:
df.apply(lambda x: df.columns[x>0].tolist(), axis = 1).to_dict()