Pandas DataFrame-通过比较创建新列

时间:2019-04-04 00:10:11

标签: python pandas

我正在尝试使用“代码”列中的值创建一个名为“ city_code”的列。但是为了做到这一点,我需要比较“ ds_city”和“ city”的值是否相等。

这是一个表格示例:

https://i.imgur.com/093GJF1.png

我已经尝试过了:

def find_code(data):
    if data['ds_city'] == data['city'] :
        return data['code']
    else:
        return 'UNKNOWN'

df['code_city'] = df.apply(find_code, axis=1)

但是,由于在“ ds_city”列中存在重复项,因此是这样的结果:

https://i.imgur.com/geHyVUA.png

以下是预期结果的图像:

https://i.imgur.com/HqxMJ5z.png

我该如何解决?

3 个答案:

答案 0 :(得分:2)

您可以使用熊猫合并:

df = pd.merge(df, df[['code', 'city']], how='left', 
              left_on='ds_city', right_on='city', 
              suffixes=('', '_right')).drop(columns='city_right')

# output:
#   code    city        ds_city     code_right
# 0 1500107 ABAETETUBA  ABAETETUBA  1500107
# 1 2900207 ABARE       ABAETETUBA  1500107
# 2 2100055 ACAILANDIA  ABAETETUBA  1500107
# 3 2300309 ACOPIARA    ABAETETUBA  1500107
# 4 5200134 ACREUNA     ABARE       2900207

这里是pandas.merge's documentation。它使用输入数据帧,并在code等于city时将其自己的ds_citycity列左连接。

code_right中找不到city时,以上代码将填充nan。您可以进一步执行以下操作以将其填充为“未知”:

df['code_right'] = df['code_right'].fillna('UNKNOWN')

答案 1 :(得分:0)

这更像 sed 's/[[:digit:]]\{4\}-[[:digit:]]\{2\}-[[:digit:]]\{2\} [[:digit:]]\{1,2\}:[[:digit:]]\{1,2\}:[[:digit:]]\{1,2\},[[:digit:]]\{1,3\} \[pool-9-thread-1\] \(INFO\|DEBUG\) wire.CampaignManagement://' file

np.where

答案 2 :(得分:0)

您可以尝试一下:

# Begin with a column of only 'UNKNOWN' values.
data['code_city'] = "UNKNOWN"
# Iterate through the cities in the ds_city column.
for i, lookup_city in enumerate(data['ds_city']):
  # Note the row which contains the corresponding city name in the city column.
  row = data['city'].tolist().index(lookup_city)
  # Reassign the current row's code_city column to that code from the row we found in the last step.
  data['code_city'][i] = data['code'][row]