我有一个以列表为值的数据框。
index=pd.MultiIndex.from_product([["file1", "file2", "file3"], ["a", "b"]])
index.names = ['file', 'name']
data = [
[[1,1],[0,0]],
[[],[]],
[[2,2,2],[7]],
[[],[]],
[[1],[4, 4]],
[[],[]],
]
df = pd.DataFrame(data, index=index, columns=['col1', 'col2'])
df
df
col1 col2
file name
file1 a [1, 1] [0, 0]
b [] []
file2 a [2, 2, 2] [7]
b [] []
file3 a [1] [4, 4]
b [] []
我想在每行和其他行的串联之间进行分组name并运行 Kolmogorov-Smirnov 测试 ( )。scipy.stats.ks_2samp名称的示例a。{file1,a}== [1,1]。其他人的串联{file2,a}+ {file3,a}== [2,2,2]+ [1]== [2,2,2,1]。他们之间的 KStest 是stats.ks_2samp([1,1], [2,2,2,1])== 0.75。我怎样才能得到下面的预期结果(手动完成)?
col1 col2
file name
file1 a 0.75 1.0
b NaN NaN
file2 a 1.0 1.0
b NaN NaN
file3 a 0.6 0.66
b NaN NaN
如果这个问题太临时,我很抱歉。
下面是我的尝试。我无法弄清楚如何优雅地将目标行从其他行中排除。
df.groupby(['name']).apply(
lambda per_name_df: per_name_df.apply(
lambda per_column: per_column.apply(
lambda cell: stats.ks_2samp(cell, np.concatenate(per_column.to_numpy())) if cell else cell)))