如何(有效地)过滤 pandas 数据框,以便它在给定特定条件的情况下从特定列中提取数据?

问题描述 投票:0回答:3

我的初始数据框看起来像这样。

课堂首页 下课 点回家 指向外
A 2 1
A 4 3
C A 6 5
A C 8 7

如果我只看“A”,我的条件是如果列“Class Home” == A,我想从列“Point Home”的同一行中提取数据。如果“Class Away” == A,我想从“Point Away”列中提取数据。生成的数据框应如下所示:

班级
A 2
A 3
A 5
A 8
1
4
C 6
C 7

我怎样才能有效地做到这一点?

我尝试过使用字典来存储每个类的数据,方法是使用 itertuples 遍历数据帧,但不确定它对大型数据集是否有效。任何帮助,将不胜感激! 提前致谢。

python pandas dataframe performance indexing
3个回答
0
投票

结合

numpy.stack
+
numpy.reshape
顺序堆叠
Home
Away
行值:

df = pd.DataFrame(np.hstack((df.filter(like='Home'), df.filter(like='Away')))
                  .reshape(-1, 2), columns=['Class', 'Point'])\
    .sort_values(by='Class')

  Class Point
0    A      2
3    A      3
5    A      5
6    A      8
1    B      1
2    B      4
4    C      6
7    C      7

0
投票

拆分索引,

stack
sort_values

out = (
 df.set_axis(df.columns.str.split(expand=True), axis=1)
   .stack()
   .sort_values(by='Class', key=lambda s: s.ne('A'),
                kind='stable', ignore_index=True)
)

输出:

  Class  Point
0     A      2
1     A      3
2     A      5
3     A      8
4     B      1
5     B      4
6     C      6
7     C      7

0
投票
import pandas as pd
import numpy as np

df = pd.DataFrame({'Class Home': ["A", "B", "C", "A"], 'Class Away': ["B", "A", "A", "C"],
                   'Point Home': [2, 4, 6, 8], 'Point Away': [1, 3, 5, 7],})

l =[]
for let in df['Class Home'].unique():
    m = ( df[['Class Home', 'Class Away']].eq(let) ).astype(int)
    e = df[['Point Home', 'Point Away']]
    a = pd.DataFrame( np.multiply(m, e).sum(axis=1) ).rename(columns={0:'Point'})
    a['Class'] = let
    l.append(a[a['Point']>0])

r = ( pd.concat(l).reset_index(drop=True) ) [['Class', 'Point']]

print(r)
  Class  Point
0     A      2
1     A      3
2     A      5
3     A      8
4     B      1
5     B      4
6     C      6
7     C      7
© www.soinside.com 2019 - 2024. All rights reserved.