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