熊猫:将两列合并为一列并具有相应的值

时间:2019-10-21 20:41:35

标签: python pandas

我有一个大型数据框,其中有一堆名称,这些名称显示在两列中 它的布局如下

Winner    Value_W     Loser     Value_L

Jack         5         Sally       -3
Sally        2         Max         -1
Max          4         Jack        -2
Lucy         1         Jack        -6
Jack         6         Henry       -3
Henry        5         Lucy        -4

然后我使用以下代码对“获胜者”和“失败者”列进行了过滤,以获取杰克出现的所有行

pd.loc[(df['Winner'] == 'Jack') | (df['Loser'] == 'Jack')]

哪个返回以下内容:

Winner    Value_W    Loser    Value_L

Jack         5       Sally      -3
Max          4       Jack       -2
Lucy         1       Jack       -6
Jack         6       Henry      -3

我现在正在寻找生成仅包含Jack及其对应值的一列。 因此,在此示例中,我想要的输出是:

New_1    New_2

Jack     5
Jack    -2
Jack    -6
Jack     6

我不确定该怎么做。

6 个答案:

答案 0 :(得分:4)

您可以wide_to_long稍稍重命名列。这使您可以捕获其他信息,例如该行是赢还是输。或者,如果您不在乎,请df1 = df1.reset_index(drop=True)

d = {'Winner': 'Person_W', 'Loser': 'Person_L'}
df1 = pd.wide_to_long(df.rename(columns=d).reset_index(),
                      stubnames=['Person', 'Value'],
                      i='index',
                      j='Win_Lose',
                      sep='_',
                      suffix='.*')

df1[df1.Person == 'Jack']
#               Person  Value
#index Win_Lose              
#0     W          Jack      5
#4     W          Jack      6
#2     L          Jack     -2
#3     L          Jack     -6

如果该特定顺序很重要,我们仍具有原始索引,以便:

df1.sort_index(level=0).query('Person == "Jack"').reset_index(drop=True) 
#  Person  Value
#0   Jack      5
#1   Jack     -2
#2   Jack     -6
#3   Jack      6

答案 1 :(得分:3)

您应该肯定要去wide_to_long,但这是一个称为lreshape的隐藏函数(将来可能会删除,取决于熊猫的开发者)

pd.lreshape(df,{'name':['Winner','Loser'],'v':['Value_W','Value_L']}).query("name=='Jack'")
Out[75]: 
   name  v
0  Jack  5
4  Jack  6
8  Jack -2
9  Jack -6

答案 2 :(得分:3)

name = 'Jack'
>>> pd.DataFrame({
    'New_1': name, 
    'New_2': df.loc[df['Winner'].eq(name), 'Value_W'].tolist() 
             + df.loc[df['Loser'].eq(name), 'Value_L'].tolist()})
  New_1  New_2
0  Jack      5
1  Jack      6
2  Jack     -2
3  Jack     -6

答案 3 :(得分:1)

我认为您只可以选择带有“杰克”的行即可使用numpy.where

import numpy as np
df['New_2'] = np.where(df['Winner'] == 'Jack', df['Value_W'], df['Value_L'])

答案 4 :(得分:0)

可能:

  1. 将其拆分为两个数据框
  2. 重命名一些列
  3. 加入
  4. 可能会删除多余的行
df_win = df[['Winner', 'Value_W']].rename(columns={'Winner':'Name','Value_W':'Value'})
df_lose = df[['Loser', 'Value_L']].rename(columns={'Loser':'Name','Value_W':'Value'})

df = df_win.join(df_lose, on='Name', how='outer')
df.loc[df.Name == 'Jack']

我确实很喜欢ALollz的答案。

答案 5 :(得分:0)

DataFrame.where + DataFrame.shift axis=1

new_df=df.where(df.eq('Jack').shift(axis=1)).sum(axis=1,min_count=1).dropna().to_frame('value')
new_df.insert(0,'Name','Jack')
print(new_df)

   Name  value
0  Jack    5.0
2  Jack   -2.0
3  Jack   -6.0
4  Jack    6.0