根据列col0的值,筛选行,替换该行的某列的值
  X5zJxoD00Cah 2023年11月02日 33 0
# 生成4行3列表格
my_df = pd.DataFrame(data=np.arange(0, 12).reshape(4, 3))
my_df.columns = ['col' + str(i) for i in my_df.columns]
print(my_df, '\n')

# 分别对每列内所有元素操作
my_result = my_df.iloc[[0, 1]].apply(lambda x: x + [3, 4, 5], axis=1)
print(my_result, '\n')

# 根据列col0的值,逐一筛选行,替换该行的某列的值
for i in my_df.index:
    for j in my_result.index:
        if my_df.loc[i, 'col0'] == my_result.loc[j, 'col0']:
            my_df.loc[i, ['col1', 'col2']] = my_result.loc[j, ['col1', 'col2']]
print(my_df, '\n')
'''
这段代码使用两个嵌套的for循环来遍历my_df和my_result的索引。
通过比较my_df中的'col0'列和my_result中的'col0'列的值,找到匹配的行,
并将my_result中对应行的'col1'和'col2'列的值替换到my_df中对应行的'col1'和'col2'列。
'''

# 方法二
# 筛选全部符合条件的行
# 赋值对象为列表,取values[0]  # 不能用tolist(),tolist()只能用于Series,而筛选结果可能是DataFrame
# 为什么要使用any()?是否会存在风险,行赋值顺序错乱?
my_df[['col1', 'col2']] = my_df.apply(
    lambda row: my_result.loc[my_result['col0'] == row['col0'], ['col1', 'col2']].values[0] \
        if any(my_result['col0'] == row['col0']) \
        else row[['col1', 'col2']], 
    axis=1
)
print(my_df)

测试:

# 生成4行3列表格
my_df = pd.DataFrame(data=np.arange(0, 12).reshape(4, 3))
my_df.columns = ['col' + str(i) for i in my_df.columns]
print(my_df, '\n')

# 分别对每列内所有元素操作_行顺序打乱
my_result = my_df.iloc[[1, 0]].apply(lambda x: x + [3, 4, 5], axis=1)
print(my_result, '\n')

# 方法二_测试打乱顺序
# 筛选全部符合条件的行
# 赋值对象为列表,取values[0]  # 不能用tolist(),tolist()只能用于Series,而筛选结果可能是DataFrame
# 为什么要使用any()?是否会存在风险,行赋值顺序错乱?
my_df[['col1', 'col2']] = my_df.apply(
    lambda row: my_result.loc[my_result['col0'] == row['col0'], ['col1', 'col2']].values[0] \
        if any(my_result['col0'] == row['col0']) \
        else row[['col1', 'col2']], 
    axis=1
)
print(my_df)
'''
结果显示,筛选出来的行顺序仍然按照原表顺序,且和赋值顺序一致
'''

补充:

如果将any改为all, 将筛选不出任何结果, 也就没有修改值

apply函数中的any的用法:

在上述代码中,`any()`函数用于检查一个可迭代对象中是否存在任何为真的元素。在这种情况下,我们使用`any(my_result['col0'] == row['col0'])`来检查`my_result`数据表中是否存在与当前行的'col0'列值相等的行。

具体来说,`my_result['col0'] == row['col0']`会生成一个布尔值的Series,其中每个元素表示对应行的'col0'列是否与当前行的'col0'列相等。然后,`any()`函数会检查这个布尔值的Series中是否存在任何为真的元素。如果存在任何为真的元素,说明`my_result`中存在与当前行的'col0'列值相等的行。

在lambda函数中,我们使用`if any(my_result['col0'] == row['col0'])`来判断是否存在匹配的行。如果存在,我们使用`my_result.loc[my_result['col0'] == row['col0'], ['col1', 'col2']].values[0]`来选择对应行的'col1'和'col2'列的值。如果不存在匹配的行,我们使用`else`语句返回当前行的'col1'和'col2'列的值。

希望这个解释能帮到你!如果还有其他问题,请随时提问。
【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
  zLxnEsMLk4BL   2023年11月19日   32   0   0 赋值运算符字符串
  gBkHYLY8jvYd   2023年11月19日   23   0   0 cifor循环字符串
  zLxnEsMLk4BL   2023年11月19日   29   0   0 赋值字符串bc
  vYgR16aEGw5K   2023年11月02日   33   0   0 嵌套2d数据
  X5zJxoD00Cah   2023年11月02日   74   0   0 数组for循环迭代
X5zJxoD00Cah