gpt4 book ai didi

python - Pandas DataFrame- 按行,有条件地用最后一列值替换多个列值

转载 作者:行者123 更新时间:2023-11-28 18:23:00 25 4
gpt4 key购买 nike

我很难找到 pandas 数据框问题的解决方案。

问题:按 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

Finished_dataframe:

       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

这会为之前为 1 的所有单元格提供 nan。

真诚的求助:
我对 pandas 和 python 很陌生,花了几个小时努力阅读 pandas 和数据框操作,但无济于事。任何建议将不胜感激!预先感谢您的时间和帮助。

最佳答案

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

这是最简单且无疑是最易读的方法,使用 numpy.where :

>>> 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。但这只是为了演示:

# 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

然后,看看那个!我们得到了相同的答案。

有关所有这些 ** 的更多信息,请参阅 Unpacking generalizations in Python 3 .它是合并字典的有效语法。

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

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

给这只猫剥皮的方法有很多!

关于python - Pandas DataFrame- 按行,有条件地用最后一列值替换多个列值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43646641/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com