0
点赞
收藏
分享

微信扫一扫

根据列col0的值,筛选行,替换该行的某列的值

# 生成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)
'''
结果显示,筛选出来的行顺序仍然按照原表顺序,且和赋值顺序一致
'''

举报

相关推荐

0 条评论