通过从每行的不同列中选择一个元素,从Pandas DataFrame创建一个Series

我的目标是通过从每行的不同列中选择一个元素,从Pandas DataFrame创建一个Series.

例如,我有以下DataFrame:

In [171]: pred[:10]
Out[171]: 
                     0  1  2
Timestamp                   
2010-12-21 00:00:00  0  0  1
2010-12-20 00:00:00  1  1  1
2010-12-17 00:00:00  1  1  1
2010-12-16 00:00:00  0  0  1
2010-12-15 00:00:00  1  1  1
2010-12-14 00:00:00  1  1  1
2010-12-13 00:00:00  0  0  1
2010-12-10 00:00:00  1  1  1
2010-12-09 00:00:00  1  1  1
2010-12-08 00:00:00  0  0  1

而且,我有以下系列:

In [172]: useProb[:10]
Out[172]: 
Timestamp
2010-12-21 00:00:00    1
2010-12-20 00:00:00    2
2010-12-17 00:00:00    1
2010-12-16 00:00:00    2
2010-12-15 00:00:00    2
2010-12-14 00:00:00    2
2010-12-13 00:00:00    0
2010-12-10 00:00:00    2
2010-12-09 00:00:00    2
2010-12-08 00:00:00    0

我想创建一个新系列usePred,它根据useProb中的列信息从pred中获取值,以返回以下内容:

In [172]: usePred[:10]
Out[172]: 
Timestamp
2010-12-21 00:00:00    0
2010-12-20 00:00:00    1
2010-12-17 00:00:00    1
2010-12-16 00:00:00    1
2010-12-15 00:00:00    1
2010-12-14 00:00:00    1
2010-12-13 00:00:00    0
2010-12-10 00:00:00    1
2010-12-09 00:00:00    1
2010-12-08 00:00:00    0

最后一步是我失败的地方.我尝试过这样的事情:

usePred = pd.DataFrame(index = pred.index)
for row in usePred:
    usePred['PREDS'].ix[row] = pred.ix[row, useProb[row]]

而且,我试过了:

usePred['PREDS'] = pred.iloc[:,useProb]

我google’d并在stackoverflow上搜索了几个小时,但似乎无法解决问题.

最佳答案 一种解决方案可能是使用
get dummies(应该更有效):

In [11]: (pd.get_dummies(useProb) * pred).sum(axis=1)
Out[11]:
Timestamp
2010-12-21 00:00:00    0
2010-12-20 00:00:00    1
2010-12-17 00:00:00    1
2010-12-16 00:00:00    1
2010-12-15 00:00:00    1
2010-12-14 00:00:00    1
2010-12-13 00:00:00    0
2010-12-10 00:00:00    1
2010-12-09 00:00:00    1
2010-12-08 00:00:00    0
dtype: float64

您可以使用几个loc的申请:

In [21]: pred.apply(lambda row: row.loc[useProb.loc[row.name]], axis=1)
Out[21]:
Timestamp
2010-12-21 00:00:00    0
2010-12-20 00:00:00    1
2010-12-17 00:00:00    1
2010-12-16 00:00:00    1
2010-12-15 00:00:00    1
2010-12-14 00:00:00    1
2010-12-13 00:00:00    0
2010-12-10 00:00:00    1
2010-12-09 00:00:00    1
2010-12-08 00:00:00    0
dtype: int64

诀窍在于您可以通过name属性访问行索引.

点赞