使用.loc进行多列赋值 - Pandas

3

我是一名有用的助手,可以帮您进行文本翻译。

我遇到了一个问题,无法使用'.loc'来分配多个列。
我希望用一行代码实现。

示例

输入数据框:

    NAME   AGE  NEW_AGE COUNTRY NEW_COUNTRY     _merge
0  LUCAS  80.0      NaN  BRAZIL         NaN  left_only
1  STEVE   NaN     35.0     NaN         USA       both
2    BEN   NaN     25.0              CANADA       both

DataFrame 输出:

    NAME   AGE  NEW_AGE COUNTRY NEW_COUNTRY     _merge
0  LUCAS  80.0      NaN  BRAZIL         NaN  left_only
1  STEVE  35.0     35.0     USA         USA       both
2    BEN  25.0     25.0  CANADA      CANADA       both

代码

import pandas as pd

people = pd.DataFrame(
    {'NAME': ['LUCAS', 'STEVE', 'BEN'],
     'AGE': [80, pd.np.nan, pd.np.nan],
     'NEW_AGE': [pd.np.nan, 35, 25],
     'COUNTRY': ['BRAZIL', pd.np.nan, ''],
     'NEW_COUNTRY': [pd.np.nan, 'USA', 'CANADA'],
     '_merge': ['left_only', 'both', 'both']
     })


people.loc[people['_merge'] == 'both', 'AGE'] = people['NEW_AGE']
people.loc[people['_merge'] == 'both', 'COUNTRY'] = people['NEW_COUNTRY']

我尝试过这种方式,但它失败了。

# USING ONLY ONE DOESNT WORK
people.loc[people['_merge'] == 'both', ['AGE', 'COUNTRY']] = \
 people[['NEW_AGE', 'NEW_COUNTRY']]

# USING TO_NUMPY CAUSE OF http://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html
people.loc[people['_merge'] == 'both', ['AGE', 'COUNTRY']] = \
 people[['NEW_AGE', 'NEW_COUNTRY']].to_numpy()

有人知道如何使用一个命令分配多列吗?

Pandas:0.24.1

谢谢。

1个回答

1

使用rename和lambda函数来处理相同列名的情况:

f = lambda x: x.replace('NEW_','')
df = people[['NEW_AGE', 'NEW_COUNTRY']].rename(columns=f)
people.loc[people['_merge'] == 'both', ['AGE', 'COUNTRY']] = df
print (people)
    NAME   AGE  NEW_AGE COUNTRY NEW_COUNTRY     _merge
0  LUCAS  80.0      NaN  BRAZIL         NaN  left_only
1  STEVE  35.0     35.0     USA         USA       both
2    BEN  25.0     25.0  CANADA      CANADA       both

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接