我有一个这样的数据框:

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)]


谢谢!

最佳答案

这不是最优雅的解决方案,但可以合并您的类别和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/

10-09 19:15