pandas使用 DataFrame 自身的某一行修改另一行的值,被修改的那一行会被清空?

df1 为:

    A   B   C   D
0  A0  B0  C0  D0
1  A1  B1  C1  D1
2  A2  B2  C2  D2
3  A3  B3  C3  D3

df2 为:

    A   B   C     D
1  A1  B4  C4    D4
2  A5  B5  C5    D5
3  A6  B6  C6  None
4  A7  B7  C7    D7

如果想要修改 df2 中第一行的值,使用:

df2.loc[df2['A']=='A1', ('B', 'C', 'D')] = df2.loc[df2['A']=='A5', ('B', 'C', 'D')],df2 会变为:

    A    B    C     D
1  A1  NaN  NaN   NaN
2  A5   B5   C5    D5
3  A6   B6   C6  None
4  A7   B7   C7    D7

第一行的值全部变为了空值,但是同样的句式,使用 df1 给 df2 的第一行赋值:
df2.loc[df2['A']=='A1', ('B', 'C', 'D')] = df1.loc[df1['A']=='A1', ('B', 'C', 'D')],则可以成功赋值,df2 为:

    A   B   C     D
1  A1  B1  C1    D1
2  A5  B5  C5    D5
3  A6  B6  C6  None
4  A7  B7  C7    D7

另外,如果将第一个赋值语句改为:df2.loc[df2['A']=='A1', ('B', 'C', 'D')] = df2.loc[df2['A']=='A5', ('B', 'C', 'D')].values,也是可以赋值成功的:

    A   B   C     D
1  A1  B5  C5    D5
2  A5  B5  C5    D5
3  A6  B6  C6  None
4  A7  B7  C7    D7

请教一下大神,为什么结果会这样?

阅读 902
1 个回答

你是不是测试有问题
df2.loc[df2['A'] == 'A1', ('B', 'C', 'D')] = df1.loc[df1['A'] == 'A1', ('B', 'C', 'D')] 不加 values 也是一样的情况。

import pandas as pd

data1 = {
    'A': ['A0', 'A1', 'A2', 'A3'],
    'B': ['B0', 'B1', 'B2', 'B3'],
    'C': ['C0', 'C1', 'C2', 'C3'],
    'D': ['D0', 'D1', 'D2', 'D3']
}

data2 = {
    'A': ['A1', 'A5', 'A6', 'A7'],
    'B': ['B4', 'B5', 'B6', 'B7'],
    'C': ['C4', 'C5', 'C6', 'C7'],
    'D': ['D4', 'D5', None, 'D7']
}

df1 = pd.DataFrame(data1)

df2 = pd.DataFrame(data2)

print(df1)
print(df2)

df2.loc[df2['A'] == 'A1', ('B', 'C', 'D')] = df1.loc[df1['A'] == 'A1', ('B', 'C', 'D')]
print(df2)

# df2.loc[df2['A'] == 'A1', ('B', 'C', 'D')] = df2.loc[df2['A'] == 'A5', ('B', 'C', 'D')]
# print(df2)
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进