我的初始数据框看起来像这样。
课堂首页 | 下课 | 点回家 | 指向外 |
---|---|---|---|
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 遍历数据帧,但不确定它对大型数据集是否有效。任何帮助,将不胜感激! 提前致谢。
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
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
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