如何根据逻辑条件拉取列值

时间:2017-06-28 17:31:15

标签: python pandas numpy

我有一个这样的数据框:

TotalCost Year Type
$100      2005 Honda
$200      2006 Toyota
$300      2007 Honda
$100      2005 Mazda
$400      2006 Honda
$300      2007 Honda

我想创建一个新的列来拉动嵌套年的TotalCost值。例如,在第一行中,代码会看到2005 Honda。然后,它会搜索2006 Honda的其余数据框,并将2006 Honda TotalCost作为名为NextYearCost的新列返回找到2005 Honda的同一行。

接下来,代码将转到数据框的第二行。它会看到它是2006 Toyota。然后,代码将在数据框中搜索2007Toyota。但是,由于没有2007 Toyota,数据框将在NA列中返回NextYearCost。代码将对数据框中的每一行执行此操作。

新列NextYearCost所需的数据框:

TotalCost Year Type    NextYearCost
$100      2005 Honda   $200
$200      2006 Toyota  NA
$300      2007 Honda   NA
$100      2005 Mazda   $400
$400      2006 Mazda   NA
$300      2007 Honda   NA

也许是这样的:

df.loc[(df['column_name'] == some_value) & df['other_column'].isin(some_values)]

谢谢!

1 个答案:

答案 0 :(得分:1)

这不是最优雅的解决方案,但合并你的类别和年份+ 1会有效。 (也可能需要检查重复项,例如我使用的原始数据有两个条目用于本田2007,因此合并会添加重复的数据行)

#import
import pandas as pd
#data
df = pd.DataFrame({'TotalCost': [100, 200, 300, 100, 400, 300], 'Year':[2005, 2006, 2007, 2005, 2006, 2007], 'Type': ['Honda', 'Toyota', 'Honda', 'Mazda', 'Honda', 'Honda']})
df
Out: 
   TotalCost    Type  Year
0        100   Honda  2005
1        200  Toyota  2006
2        300   Honda  2007
3        100   Mazda  2005
4        400   Honda  2006
5        300   Honda  2007
df['next_year'] = df['Year'] + 1
df
Out: 
   TotalCost    Type  Year  next_year
0        100   Honda  2005       2006
1        200  Toyota  2006       2007
2        300   Honda  2007       2008
3        100   Mazda  2005       2006
4        400   Honda  2006       2007
5        300   Honda  2007       2008
df = pd.merge(df, df, how='left', left_on=['next_year', 'Type'], right_on=['Year', 'Type'])
df
Out: 
   TotalCost_x    Type  Year_x  next_year_x  TotalCost_y  Year_y  next_year_y
0          100   Honda    2005         2006        400.0  2006.0       2007.0
1          200  Toyota    2006         2007          NaN     NaN          NaN
2          300   Honda    2007         2008          NaN     NaN          NaN
3          100   Mazda    2005         2006          NaN     NaN          NaN
4          400   Honda    2006         2007        300.0  2007.0       2008.0
5          400   Honda    2006         2007        300.0  2007.0       2008.0
6          300   Honda    2007         2008          NaN     NaN          NaN

然后,如果您愿意,可以删除一些列并清理生成的表:

df.drop(['Year_y', 'next_year_y', 'next_year_x'], inplace=True, axis=1)
df.rename(columns={'TotalCost_x':'TotalCost', 'Year_x': 'Year', 'TotalCost_y': 'NextYearCost'}, inplace=True)
df
Out: 
   TotalCost    Type  Year  NextYearCost
0        100   Honda  2005         400.0
1        200  Toyota  2006           NaN
2        300   Honda  2007           NaN
3        100   Mazda  2005           NaN
4        400   Honda  2006         300.0
5        400   Honda  2006         300.0
6        300   Honda  2007           NaN