我有一个这样的数据框:
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)]
谢谢!
最佳答案
这不是最优雅的解决方案,但可以合并您的类别和Year + 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
关于python - 如何根据逻辑条件提取列值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44809131/