gpt4 book ai didi

python - 是否可以在 pandas 数据框中通过名称显式引用索引?

转载 作者:太空宇宙 更新时间:2023-11-03 18:57:28 27 4
gpt4 key购买 nike

在 pandas DataFrames 中,允许组合列来构建索引(如果每行都有这些列中值的唯一组合)。这样做的好处之一是简化语法,而不是:

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[(1, 2, 0, 'aaa', 10)]

但为此我总是需要记住索引的顺序。如果我能做这样的事情那就更好了:

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

注意:名称可能还需要更改...

关于python - 是否可以在 pandas 数据框中通过名称显式引用索引?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16959051/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com