Python 按行替换数据帧,有条件地用最后一列值替换多个列值

Python 按行替换数据帧,有条件地用最后一列值替换多个列值,python,python-2.7,Python,Python 2.7,我很难找到熊猫数据帧问题的解决方案 问题:按数据帧中的行,如果单元格等于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,则将其替换为数据帧最后一列中的单元格值。我已经构建并填充了初始数据帧,但还不能继续下一步

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

初始数据帧:

       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
       fNum  1  2  3  4  5  6  7  labelx
Index                                       
1         1  0  2  2  2  0  0  0       2
2         1  0  0  2  2  0  0  0       2
4         1  0  0  0  0  0  3  0       3
5         1  0  0  0  0  0  0  0       0
6         1  0  0  3  0  0  0  0       3
7         1  0  0  0  3  0  0  0       3
1         2  0  2  0  0  0  0  0       2
2         2  2  2  2  0  0  0  0       2
3         2  2  2  2  0  0  0  0       2
4         2  2  2  0  0  0  0  0       2
5         2  0  0  0  0  0  0  0       0
6         2  0  0  0  0  3  3  3       3
7         2  0  0  0  0  3  3  3       3
完成的数据帧:

       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
       fNum  1  2  3  4  5  6  7  labelx
Index                                       
1         1  0  2  2  2  0  0  0       2
2         1  0  0  2  2  0  0  0       2
4         1  0  0  0  0  0  3  0       3
5         1  0  0  0  0  0  0  0       0
6         1  0  0  3  0  0  0  0       3
7         1  0  0  0  3  0  0  0       3
1         2  0  2  0  0  0  0  0       2
2         2  2  2  2  0  0  0  0       2
3         2  2  2  2  0  0  0  0       2
4         2  2  2  0  0  0  0  0       2
5         2  0  0  0  0  0  0  0       0
6         2  0  0  0  0  3  3  3       3
7         2  0  0  0  0  3  3  3       3
尝试的最新路径:

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

dfIX=initial_dataframe.ix[:,2:8]#我重新创建了部分数据,因为输入数据最初是以图片而不是可复制文本的形式发布的。我将让您根据您的具体数据调整此方法

以下是最简单、最具可读性的方法,使用:

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

# Here is where we use a dictionary to get the new values from the final column
>>> new_values = {c: [df.loc[idx, 'label_x'] if val == 1 else val for idx, val in enumerate(df[c])] for c in df[list(filter(lambda x: x != 'label_x', df))]}
>>> new_values
{1: [0, 0, 0, 0, 0, 0, 0, 2, 0, 2], 2: [2, 2, 3, 0, 0, 0, 0, 0, 2, 0], 3: [2, 2, 0, 0, 0, 0, 0, 2, 2, 0]}

# We can just create a new dataframe with the "new" columns made above
# and the original label_x column
>>> new_df = pd.DataFrame({**new_values, **{'label_x': df['label_x'].values}})
>>> new_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
还有,看那个!我们得到了相同的答案

有关所有这些
**
的更多信息,请参阅。它是合并词典的有效语法

您还可以考虑这样做,基本上在
新值中遍历每一列的对应列表

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

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

你也可以用
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
还有,这个

mask = df.values[:, :-1] == 1
df.values[:, :-1] = np.where(mask, mask * df.values[:, -1:], df.values[:, :-1])
产量

 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

您似乎是StackOverflow的新手,请访问此网站。我们不咬人,只要为你付出一点努力。谢谢你帮助我改进我的问题。我将继续努力使其更加连贯和参与。我做了一些编辑。谢谢,这看起来很完美!我兜圈子已经太久了。了解这两种解决方案的灵活性值得赞赏。对于更大的数据帧,where方法是首选的吗?{9000,600}600列不应该是太大的问题。如果需要考虑速度的话,NumPy通常是首选解决方案,因为它大部分是用后端速度快得多的C编写的。如果这能解决您的问题,请投票并接受!你救了我一天。非常感谢。