Python 按行替换数据帧,有条件地用最后一列值替换多个列值
我很难找到熊猫数据帧问题的解决方案 问题:按数据帧中的行,如果单元格等于1,则将其替换为数据帧最后一列中的单元格值。我已经构建并填充了初始数据帧,但还不能继续下一步 数据帧:数据帧示例(初始和完成): 初始数据帧: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
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编写的。如果这能解决您的问题,请投票并接受!你救了我一天。非常感谢。