Python 是否可以在数据帧中按索引名称显式引用索引?
在这种情况下,数据帧允许列的组合来构建索引(如果每一行都有来自这些列的值的唯一组合)。这样做的好处之一是简化语法,而不是:Python 是否可以在数据帧中按索引名称显式引用索引?,python,indexing,dataframe,pandas,Python,Indexing,Dataframe,Pandas,在这种情况下,数据帧允许列的组合来构建索引(如果每一行都有来自这些列的值的唯一组合)。这样做的好处之一是简化语法,而不是: my_data_frame[(my_data_frame['column_name_1']==0) & (my_data_frame['column_name_2']==1)] 我们可以使用: my_data_frame[(0,1)] 以下是我如何使用多个列构建索引的示例: import pandas as pd ls = [{'col1':10, 'col2
my_data_frame[(my_data_frame['column_name_1']==0) & (my_data_frame['column_name_2']==1)]
我们可以使用:
my_data_frame[(0,1)]
以下是我如何使用多个列构建索引的示例:
import pandas as pd
ls = [{'col1':10, 'col2':0, 'col3':0, 'col4':100}, {'col1':20, 'col2':0, 'col3':1, 'col4':200}, {'col1':30, 'col2':1, 'col3':0, 'col4':300}, {'col1':40, 'col2':1, 'col3':1, 'col4':400}]
df = pd.DataFrame(ls).set_index(['col2','col3'])
df.ix[(0,0)]['col1'] # returns 10
df.ix[('col3'=1, 'col2'=0)] # <----- This does not work. (SyntaxError: invalid syntax)
但为此,我总是需要记住索引的顺序。如果我能做一些像这样的事情会更好:
df[(age=10, scale=2, grade=0, name='aaa', size=1)]
您可以编写自己的助手:
In [11]: df1
Out[11]:
col1 col4
col2 col3
0 0 10 100
1 20 200
1 0 30 300
1 40 400
In [12]: d = {'col3': 1, 'col2': 0}
如果您确实知道您正在传递所有名称,您可以将它们按正确的顺序排列:
In [13]: t = tuple(map(d.get, df1.index.names))
In [14]: t
Out[14]: (0, 1)
In [15]: df1.loc[t]
Out[15]:
col1 20
col4 200
Name: (0, 1), dtype: int64
如果您没有这样做,并且想要更强大一点的东西,那么您可以做一些更棘手的事情,如下所示(当然有一种更有效的方法可以做到这一点,而不会降低成本)。但有一个想法:
def reduce_kv(df, kv):
try:
return df.xs(kv[1], level=kv[0])
except (AttributeError,):
if df.index.name == kv[0]:
return df.loc[kv[1]]
else:
raise AttributeError("Level %s not found" % kv[0])
In [17]: reduce(reduce_kv, d.items(), df1)
Out[17]:
col1 20
col4 200
Name: 1, dtype: int64
注意:名称可能也需要更改…您可以编写自己的助手:
In [11]: df1
Out[11]:
col1 col4
col2 col3
0 0 10 100
1 20 200
1 0 30 300
1 40 400
In [12]: d = {'col3': 1, 'col2': 0}
如果您确实知道您正在传递所有名称,您可以将它们按正确的顺序排列:
In [13]: t = tuple(map(d.get, df1.index.names))
In [14]: t
Out[14]: (0, 1)
In [15]: df1.loc[t]
Out[15]:
col1 20
col4 200
Name: (0, 1), dtype: int64
如果您没有这样做,并且想要更强大一点的东西,那么您可以做一些更棘手的事情,如下所示(当然有一种更有效的方法可以做到这一点,而不会降低成本)。但有一个想法:
def reduce_kv(df, kv):
try:
return df.xs(kv[1], level=kv[0])
except (AttributeError,):
if df.index.name == kv[0]:
return df.loc[kv[1]]
else:
raise AttributeError("Level %s not found" % kv[0])
In [17]: reduce(reduce_kv, d.items(), df1)
Out[17]:
col1 20
col4 200
Name: 1, dtype: int64
注意:名称可能也需要更改…我认为答案是否定的。。。但您可以编写一个助手函数来完成此操作。是否要将其添加到文件?我发现你正在寻找的糖非常有用,希望它能被制成某种东西。我认为答案是否定的。。。但您可以编写一个助手函数来完成此操作。是否要将其添加到文件?我发现你正在寻找的糖非常有用,希望它能以某种方式被植入体内