Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 通过从每行的不同列中选择元素,从数据框中创建一个系列_Python_Python 2.7_Pandas_Time Series_Dataframe - Fatal编程技术网

Python 通过从每行的不同列中选择元素,从数据框中创建一个系列

Python 通过从每行的不同列中选择元素,从数据框中创建一个系列,python,python-2.7,pandas,time-series,dataframe,Python,Python 2.7,Pandas,Time Series,Dataframe,我的目标是通过从每行的不同列中选择一个元素,从Pandas数据框中创建一个系列 例如,我有以下数据帧: 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

我的目标是通过从每行的不同列中选择一个元素,从Pandas数据框中创建一个系列

例如,我有以下数据帧:

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]

我在stackoverflow上搜索了几个小时,但似乎无法解决问题。

一个解决方案可能是使用(应该更有效):

您可以将应用程序与几个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属性访问rows索引。

下面是另一种方法:

它似乎正是您所需要的,只是必须注意提供作为标签的值。例如,如果
pred.columns
是字符串,而
useProb['0']
值是整数,那么我们可以使用

pred.columns[useProb['0']]
因此,传递给
col\u labels
参数的值是正确的标签值


比如说,

import io
import pandas as pd
content = io.BytesIO('''\
Timestamp  0  1  2
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''')
pred = pd.read_table(content, sep='\s{2,}', parse_dates=True, index_col=[0])

content = io.BytesIO('''\
Timestamp  0
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''')
useProb = pd.read_table(content, sep='\s{2,}', parse_dates=True, index_col=[0])
print(pd.Series(pred.lookup(row_labels=pred.index, 
                col_labels=pred.columns[useProb['0']]),
                index=pred.index))
屈服

    Timestamp
2010-12-21    0
2010-12-20    1
2010-12-17    1
2010-12-16    1
2010-12-15    1
2010-12-14    1
2010-12-13    0
2010-12-10    1
2010-12-09    1
2010-12-08    0
dtype: int64

@布赖恩补充了另一个更整洁的解决方案。
import io
import pandas as pd
content = io.BytesIO('''\
Timestamp  0  1  2
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''')
pred = pd.read_table(content, sep='\s{2,}', parse_dates=True, index_col=[0])

content = io.BytesIO('''\
Timestamp  0
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''')
useProb = pd.read_table(content, sep='\s{2,}', parse_dates=True, index_col=[0])
print(pd.Series(pred.lookup(row_labels=pred.index, 
                col_labels=pred.columns[useProb['0']]),
                index=pred.index))
    Timestamp
2010-12-21    0
2010-12-20    1
2010-12-17    1
2010-12-16    1
2010-12-15    1
2010-12-14    1
2010-12-13    0
2010-12-10    1
2010-12-09    1
2010-12-08    0
dtype: int64