逐行Pandas数据帧,有条件地用最后一列的值替换多个列值

2024-09-30 08:29:08 发布

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

我很难找到熊猫数据帧问题的解决方案。在

问题:按pandas数据帧中的行,如果单元格等于1,则将其替换为数据帧最后一列中的单元格值。我已经构建并填充了初始数据帧,但还不能继续下一步。在

数据帧:数据帧示例(初始和完成):

初始数据帧:

       fNum  1  2  3  4  5  6  7  labelx
Index                                   
1         1  0  1  1  1  0  0  0       2
2         1  0  0  1  1  0  0  0       2
4         1  0  0  0  0  0  1  0       3
5         1  0  0  0  0  0  0  0       0
6         1  0  0  1  0  0  0  0       3
7         1  0  0  0  1  0  0  0       3
1         2  0  1  0  0  0  0  0       2
2         2  1  1  1  0  0  0  0       2
3         2  1  1  1  0  0  0  0       2
4         2  1  1  0  0  0  0  0       2
5         2  0  0  0  0  1  0  0       0
6         2  0  0  0  0  1  1  1       3
7         2  0  0  0  0  1  1  1       3

完成的_数据帧:

^{pr2}$

尝试的最新路径:

dfIX = Intitial_dataframe.ix[:, 2:8] #<--The "body" of the data
labelx_frame = Intitial_dataframe.ix[:, 8:9] #<-- The labelx column
dfIX[dfIX>0] = labelx_frame  #<-- Attempt to replace values, nan instead

这将为所有先前为1的单元格提供nan。在

真诚的求助:
我对pandas和python非常陌生,花了几个小时反复阅读pandas和dataframe操作,但都没有结果。如有任何建议,我们将不胜感激!提前感谢您的时间和帮助。在


Tags: the数据示例dataframepandasindexnan解决方案
2条回答

您也可以使用numpy来完成此操作。在

df = pd.DataFrame({1: [0,0,0,1,1,0,0,1,0,1], 2: [1,1,1,1,0,0,0,0,1,0], 3: [1,1,0,1,0,0,0,1,1,0], 'label_x': [2,2,3,0,0,2,3,2,2,2]})

1  2  3  label_x
0  0  1  1        2
1  0  1  1        2
2  0  1  0        3
3  1  1  1        0
4  1  0  0        0
5  0  0  0        2
6  0  0  0        3
7  1  0  1        2
8  0  1  1        2
9  1  0  0        2

还有,这个

^{pr2}$

收益率

 1  2  3  label_x
0  0  2  2        2
1  0  2  2        2
2  0  3  0        3
3  0  0  0        0
4  0  0  0        0
5  0  0  0        2
6  0  0  0        3
7  2  0  2        2
8  0  2  2        2
9  2  0  0        2

我重新创建了部分数据,因为输入数据最初是作为图片发布的,而不是可复制文本。我将让您根据您的具体数据调整此方法。在

下面是使用^{}最简单、最易读的方法:

>>> df = pd.DataFrame({1: [0,0,0,1,1,0,0,1,0,1], 2: [1,1,1,1,0,0,0,0,1,0], 3: [1,1,0,1,0,0,0,1,1,0], 'label_x': [2,2,3,0,0,2,3,2,2,2]})
>>> df
   1  2  3  label_x
0  0  1  1        2
1  0  1  1        2
2  0  1  0        3
3  1  1  1        0
4  1  0  0        0
5  0  0  0        2
6  0  0  0        3
7  1  0  1        2
8  0  1  1        2
9  1  0  0        2
>>> for c in df:
...     if c != 'label_x':
...         df[c] = np.where(df[c] == 1, df['label_x'], df[c])
... 
>>> df
   1  2  3  label_x
0  0  2  2        2
1  0  2  2        2
2  0  3  0        3
3  0  0  0        0
4  0  0  0        0
5  0  0  0        2
6  0  0  0        3
7  2  0  2        2
8  0  2  2        2
9  2  0  0        2

这里有另一种方法,但我只是将其作为Python“强大”的一个例子(我不知道这个词是否正确)。这实际上是我最初解决你的问题的方法,但我认为只提供这个就有点过分了。如果我是你,我更喜欢numpy.where。但这只是为了演示:

^{pr2}$

还有,看看那个!我们得到同样的答案。在

有关所有这些**的详细信息,请参见Unpacking generalizations in Python 3。它是合并词典的有效语法。在

您还可以考虑这样做,基本上遍历new_values中每个列的对应列表:

for c in [1,2,3]:
    df[c] = new_values[c]

有很多方法可以剥这只猫的皮!在

相关问题 更多 >

    热门问题