我有一个大型数据框,其中有一堆名称,这些名称显示在两列中 它的布局如下
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
我不确定该怎么做。
答案 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)
可能:
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