Pandas 通过选择最可能的将多行合并为一
Pandas collapse multiple rows into one by selecting the most probable
问题
我的第一个 DataFrame 包含以下内容:
df1 = pd.DataFrame(
[[1, 'C_A'], [2, 'C_B'], [3, 'C_C'], [3, 'C_D'], [4, 'C_F']],
columns=['time', 'category']
)
time category
0 1 C_A
1 2 C_B
2 3 C_C
3 3 C_D
4 4 C_F
有一些行具有多个时间条目。
现在我的第二个 df 是概率分布在每个时间每个类别:
df2 = pd.DataFrame(
[[1., 0., 0., 0., 0.], [0., 1., 0., 0., 0.],
[0., 0., 0.7, 0.3, 0.], [1, 0., 0., 0., 0.]],
columns=['C_A', 'C_B', 'C_C', 'C_D', 'C_F']
)
C_A C_B C_C C_D C_F
0 1.0 0.0 0.0 0.0 0.0
1 0.0 1.0 0.0 0.0 0.0
2 0.0 0.0 0.7 0.3 0.0
3 1.0 0.0 0.0 0.0 0.0
对于只有一次的行,我想保持原样。
但是,例如,对于 df1
的 3rd 和 4th 行,我只想保留 1多行中的
最高概率.
最终结果为:
pd.DataFrame(
[[1, 'C_A'], [2, 'C_B'], [3, 'C_C'], [4, 'C_F']],
columns=['time', 'category']
)
time category
0 1 C_A
1 2 C_B
2 3 C_C
3 4 C_F
问题
当这些多行出现时,我如何折叠这些行,并根据我的其他 DataFrame 保留概率最大的行?
您想使用 df1.time
作为索引并使用 df2.category
作为列从 df2
中提取值(概率)。然后,您可以对值进行排序并删除重复项。
第一步基本上是已弃用的 lookup
函数的情况。您可以改用 numpy 索引:
row_idx, col_idx = df2.index.get_indexer(df1.time-1), df2.columns.get_indexer(df1.category)
(df1.assign(prob=df2.to_numpy()[row_idx, col_idx])
.sort_values(['time', 'prob'])
.drop_duplicates('time', keep='last')
)
输出:
time category prob
0 1 C_A 1.0
1 2 C_B 1.0
2 3 C_C 0.7
4 4 C_F 0.0
问题
我的第一个 DataFrame 包含以下内容:
df1 = pd.DataFrame(
[[1, 'C_A'], [2, 'C_B'], [3, 'C_C'], [3, 'C_D'], [4, 'C_F']],
columns=['time', 'category']
)
time category
0 1 C_A
1 2 C_B
2 3 C_C
3 3 C_D
4 4 C_F
有一些行具有多个时间条目。
现在我的第二个 df 是概率分布在每个时间每个类别:
df2 = pd.DataFrame(
[[1., 0., 0., 0., 0.], [0., 1., 0., 0., 0.],
[0., 0., 0.7, 0.3, 0.], [1, 0., 0., 0., 0.]],
columns=['C_A', 'C_B', 'C_C', 'C_D', 'C_F']
)
C_A C_B C_C C_D C_F
0 1.0 0.0 0.0 0.0 0.0
1 0.0 1.0 0.0 0.0 0.0
2 0.0 0.0 0.7 0.3 0.0
3 1.0 0.0 0.0 0.0 0.0
对于只有一次的行,我想保持原样。
但是,例如,对于 df1
的 3rd 和 4th 行,我只想保留 1多行中的
最高概率.
最终结果为:
pd.DataFrame(
[[1, 'C_A'], [2, 'C_B'], [3, 'C_C'], [4, 'C_F']],
columns=['time', 'category']
)
time category
0 1 C_A
1 2 C_B
2 3 C_C
3 4 C_F
问题
当这些多行出现时,我如何折叠这些行,并根据我的其他 DataFrame 保留概率最大的行?
您想使用 df1.time
作为索引并使用 df2.category
作为列从 df2
中提取值(概率)。然后,您可以对值进行排序并删除重复项。
第一步基本上是已弃用的 lookup
函数的情况。您可以改用 numpy 索引:
row_idx, col_idx = df2.index.get_indexer(df1.time-1), df2.columns.get_indexer(df1.category)
(df1.assign(prob=df2.to_numpy()[row_idx, col_idx])
.sort_values(['time', 'prob'])
.drop_duplicates('time', keep='last')
)
输出:
time category prob
0 1 C_A 1.0
1 2 C_B 1.0
2 3 C_C 0.7
4 4 C_F 0.0