如何 select 只有 pandas 多索引数据框中的索引列?
How to select ONLY THE INDEX COLUMNS in a pandas multi-index Dataframe?
好的,所以我有一个带有 2 列索引的 DataFrame,我正在尝试从该 DataFrame 中过滤行,并仅将原始数据帧的索引列保留到新过滤的 DataFrame 中。
我通过以下方式从 CSV 文件创建数据框:查找 CSV 文件 here
census_df = pd.read_csv("census.csv", index_col = ["STNAME", "CTYNAME"])
census_df.sort_index(ascending = True)
然后,我对 DataFrame 应用了一些过滤,效果非常好,我得到了所需的行。我使用的代码如下所示:
def my_answer():
mask1 = census_df["REGION"].between(1, 2)
mask2 = census_df.index.get_level_values("CTYNAME").str.startswith("Washington")
mask3 = (census_df["POPESTIMATE2015"] > census_df["POPESTIMATE2014"])
new_df = census_df[mask1 & mask2 & mask3]
return pd.DataFrame(new_df.iloc[:, -1])
my_answer()
这是问题所在:
上面的代码 return 是一个数据框,其中包含索引和第一列以及 2 个索引列。我想要的只是两个索引列。
因此,最终答案应该是 return 一个 DATAFRAME,其中包含 "STNAME" 和 "CTYNAME",其中有 5 行。
您可以将 index
转换为 DataFrame
:
def my_answer():
mask1 = census_df["REGION"].between(1, 2)
mask2 = census_df.index.get_level_values("CTYNAME").str.startswith("Washington")
mask3 = (census_df["POPESTIMATE2015"] > census_df["POPESTIMATE2014"])
new_df = census_df[mask1 & mask2 & mask3]
return pd.DataFrame(new_df.index.tolist(), columns=['STNAME','CTYNAME'])
print (my_answer())
STNAME CTYNAME
0 Iowa Washington County
1 Minnesota Washington County
2 Pennsylvania Washington County
3 Rhode Island Washington County
4 Wisconsin Washington County
如果想要输出 MultiIndex
需要 MultiIndex.remove_unused_levels
,但它在 pandas 0.20.0+
中工作:
def my_answer():
mask1 = census_df["REGION"].between(1, 2)
mask2 = census_df.index.get_level_values("CTYNAME").str.startswith("Washington")
mask3 = (census_df["POPESTIMATE2015"] > census_df["POPESTIMATE2014"])
new_df = census_df[mask1 & mask2 & mask3]
return new_df.index.remove_unused_levels()
print (my_answer())
MultiIndex(levels=[['Iowa', 'Minnesota', 'Pennsylvania', 'Rhode Island', 'Wisconsin'],
['Washington County']],
labels=[[0, 1, 2, 3, 4], [0, 0, 0, 0, 0]],
names=['STNAME', 'CTYNAME'])
使用列表理解:
def my_answer():
mask1 = census_df["REGION"].between(1, 2)
mask2 = census_df.index.get_level_values("CTYNAME").str.startswith("Washington")
mask3 = (census_df["POPESTIMATE2015"] > census_df["POPESTIMATE2014"])
new_df = census_df[mask1 & mask2 & mask3]
return pd.DataFrame([new_df.index[x] for x in range(len(new_df))])
my_answer()
输出:
0 1
0 Iowa Washington County
1 Minnesota Washington County
2 Pennsylvania Washington County
3 Rhode Island Washington County
4 Wisconsin Washington County``
好的,所以我有一个带有 2 列索引的 DataFrame,我正在尝试从该 DataFrame 中过滤行,并仅将原始数据帧的索引列保留到新过滤的 DataFrame 中。
我通过以下方式从 CSV 文件创建数据框:查找 CSV 文件 here
census_df = pd.read_csv("census.csv", index_col = ["STNAME", "CTYNAME"])
census_df.sort_index(ascending = True)
然后,我对 DataFrame 应用了一些过滤,效果非常好,我得到了所需的行。我使用的代码如下所示:
def my_answer():
mask1 = census_df["REGION"].between(1, 2)
mask2 = census_df.index.get_level_values("CTYNAME").str.startswith("Washington")
mask3 = (census_df["POPESTIMATE2015"] > census_df["POPESTIMATE2014"])
new_df = census_df[mask1 & mask2 & mask3]
return pd.DataFrame(new_df.iloc[:, -1])
my_answer()
这是问题所在:
上面的代码 return 是一个数据框,其中包含索引和第一列以及 2 个索引列。我想要的只是两个索引列。 因此,最终答案应该是 return 一个 DATAFRAME,其中包含 "STNAME" 和 "CTYNAME",其中有 5 行。
您可以将 index
转换为 DataFrame
:
def my_answer():
mask1 = census_df["REGION"].between(1, 2)
mask2 = census_df.index.get_level_values("CTYNAME").str.startswith("Washington")
mask3 = (census_df["POPESTIMATE2015"] > census_df["POPESTIMATE2014"])
new_df = census_df[mask1 & mask2 & mask3]
return pd.DataFrame(new_df.index.tolist(), columns=['STNAME','CTYNAME'])
print (my_answer())
STNAME CTYNAME
0 Iowa Washington County
1 Minnesota Washington County
2 Pennsylvania Washington County
3 Rhode Island Washington County
4 Wisconsin Washington County
如果想要输出 MultiIndex
需要 MultiIndex.remove_unused_levels
,但它在 pandas 0.20.0+
中工作:
def my_answer():
mask1 = census_df["REGION"].between(1, 2)
mask2 = census_df.index.get_level_values("CTYNAME").str.startswith("Washington")
mask3 = (census_df["POPESTIMATE2015"] > census_df["POPESTIMATE2014"])
new_df = census_df[mask1 & mask2 & mask3]
return new_df.index.remove_unused_levels()
print (my_answer())
MultiIndex(levels=[['Iowa', 'Minnesota', 'Pennsylvania', 'Rhode Island', 'Wisconsin'],
['Washington County']],
labels=[[0, 1, 2, 3, 4], [0, 0, 0, 0, 0]],
names=['STNAME', 'CTYNAME'])
使用列表理解:
def my_answer():
mask1 = census_df["REGION"].between(1, 2)
mask2 = census_df.index.get_level_values("CTYNAME").str.startswith("Washington")
mask3 = (census_df["POPESTIMATE2015"] > census_df["POPESTIMATE2014"])
new_df = census_df[mask1 & mask2 & mask3]
return pd.DataFrame([new_df.index[x] for x in range(len(new_df))])
my_answer()
输出:
0 1
0 Iowa Washington County
1 Minnesota Washington County
2 Pennsylvania Washington County
3 Rhode Island Washington County
4 Wisconsin Washington County``