使用dataframe转换另一个datafram的列标签

2024-09-29 00:19:06 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个熊猫数据帧;buffers_slotsslots_vessels 两者都只包含0和1作为数据。 我正在研究一个容器分配问题,其中选择了多个容器并用于准备多个缓冲区。 缓冲器和容器之间的连接是概念上的“槽”。你知道吗

buffers_slots数据帧告诉我每个缓冲区准备在哪个插槽中。 其中,每行和为一,即每个缓冲区只在一个插槽中。你知道吗

>>> buffers_slots
              5    7    8
Buffer #24  0.0  0.0  1.0
Buffer #25  1.0  0.0  0.0
Buffer #26  1.0  0.0  0.0
Buffer #27  0.0  0.0  1.0
Buffer #28  0.0  1.0  0.0
Buffer #29  0.0  1.0  0.0

slots\u vessels数据框告诉我给定插槽中的容器大小(可能有空插槽,即每行总和为0或1)。也可以在多个槽中使用相同尺寸的容器,即每列的总和可以为0、1或多个)。你知道吗

>>> slots_vessels
   1000 L  2000 L  3000 L  4000 L  5000 L  6000 L  7000 L  8000 L
0     0.0     0.0     0.0     0.0     0.0     0.0     0.0     0.0
1     0.0     0.0     0.0     0.0     0.0     0.0     0.0     0.0
2     0.0     0.0     0.0     0.0     0.0     0.0     0.0     0.0
3     0.0     0.0     0.0     0.0     0.0     0.0     0.0     0.0
4     0.0     0.0     0.0     0.0     0.0     0.0     0.0     0.0
5     0.0     1.0     0.0     0.0     0.0     0.0     0.0     0.0
6     0.0     0.0     0.0     0.0     0.0     0.0     0.0     0.0
7     0.0     0.0     0.0     0.0     0.0     0.0     1.0     0.0
8     0.0     0.0     0.0     1.0     0.0     0.0     0.0     0.0

我基本上想使用slots_vessels数据框来翻译buffers_slots数据框中的列名,即分别用'2000l'、'7000l'和'4000l'替换5、7、8,给出以下输出:

>>> buffers_vessels
              2000 L    7000 L    4000 L
Buffer #24       0.0       0.0       1.0
Buffer #25       1.0       0.0       0.0
Buffer #26       1.0       0.0       0.0
Buffer #27       0.0       0.0       1.0
Buffer #28       0.0       1.0       0.0
Buffer #29       0.0       1.0       0.0

我认为解决方案可能包括创建一个dict映射槽到血管,例如:

>>> slots
{0: None, 1: None, 2: None, 3: None, 4: None, 5: '2000 L', 6: None, 7: '7000 L', 8: '4000 L'}

…但我不知道如何创造这样一个格言

或者,是否有一些简洁的映射/翻译方法来实现我的目标?你知道吗


Tags: 数据none概念尺寸buffer解决方案容器dict
2条回答

以下是成功的秘诀:

slots = dict(slots_vessels.T.idxmax())
buffers_vessels = buffers_slots.rename(slots, axis='columns')

输出:

>>> slots
{0: '1000 L', 1: '1000 L', 2: '1000 L', 3: '2000 L', 4: '1000 L', 5: '1000 L', 6: '1000 L', 7: '7000 L', 8: '4000 L'}
>>> buffers_vessels
            2000 L  7000 L  4000 L
Buffer #24     0.0     0.0     1.0
Buffer #25     1.0     0.0     0.0
Buffer #26     1.0     0.0     0.0
Buffer #27     0.0     0.0     1.0
Buffer #28     0.0     1.0     0.0
Buffer #29     0.0     1.0     0.0

插槽dict中的值有点误导,因为它表示每个空插槽中都有一个1000升的容器,但由于我们对空插槽不感兴趣,因此没有执行此错误。 如果存在这样一个函数来创建OP中所示的slotsdict,那么最好用“where equal to 1”函数替换idxmax函数

如果每行最多只有一个1.0,则可以使用此处描述的函数查找与1.0匹配的列来创建新的数据帧:

Get column name where value is something in pandas dataframe

cols['column'] = df.apply(lambda x: df.columns[x.argmax()], axis = 1)

把它转换成dictd_cols。你知道吗

然后,您可以在刚刚创建的dict的帮助下替换列的名称:

df.rename(d_cols)

相关问题 更多 >