在使用带有pandas的kaggle titanic数据集时,我找到了一个我在python中编写显式循环的地方,但我想知道是否有更有效的方法?请考虑以下程序:
#!/usr/bin/python
import pandas as pd
# Assume that we have a dataframe with three fields
f = pd.DataFrame([ (0,1,1),
(1,0,0),
(1,1,1),
(1,1,0),
],
columns=list('ABY'))
# and a multi index of A,B
idx = pd.MultiIndex.from_product([(0,1),(0,1)],
names=list('AB'))
# For each idx I want a list of the values of F.Y for which A and B match. This
# can be done through the following loop:
e = []
for a,b in idx:
e += [list(f.Y[(f.A==a) & (f.B==b)])]
s = pd.Series(e, index=idx, name='Y')
print s
# Yields:
# A B
# 0 0 []
# 1 [1]
# 1 0 [0]
# 1 [1, 0]
# Name: Y, dtype: object
我的问题是,是否可以在没有循环的情况下生成s
答案 0 :(得分:2)
这是一种几乎相同的方式:
>>> f.groupby(["A", "B"])["Y"].apply(list).ix[idx]
A B
0 0 NaN
1 [1]
1 0 [0]
1 [1, 0]
dtype: object
唯一的区别是,在没有匹配的情况下,这会给出NaN而不是空列表。很遗憾,由于this issue,您无法使用fillna
将空NaN替换为空列表。但是,您可以使用dropna
删除它,并且在许多情况下,无论如何您都不需要空项目,而且没有匹配的情况。