我有一个这样的数据框:
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
。然后,代码将在数据框中搜索2007
和Toyota
。但是,由于没有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)]
谢谢!
答案 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