如何从数据框列字符串中提取句点和变量名称以准备多索引面板数据
How to extract period and variable name from dataframe column strings for multiindex panel data preparation
我是 Python 的新手,到处都找不到我要找的答案。
我有一个具有以下结构的 DataFrame:
df = pd.DataFrame(index=list('abc'), data={'A1': range(3), 'A2': range(3),'B1': range(3), 'B2': range(3), 'C1': range(3), 'C2': range(3)})
df
Out[1]:
A1 A2 B1 B2 C1 C2
a 0 0 0 0 0 0
b 1 1 1 1 1 1
c 2 2 2 2 2 2
其中数字是句点,字母是变量。我想以某种方式转换列,将句点和变量拆分为多索引。所需的输出看起来像这样
A B C
1 2 1 2 1 2
a 0 0 0 0 0 0
b 1 1 1 1 1 1
c 2 2 2 2 2 2
我试过以下方法:
periods = list(range(1, 3))
df.columns = df.columns.str.replace('\d+', '')
df.columns = pd.MultiIndex.from_product([df.columns, periods])
这似乎是将列相乘并引发 ValueError:长度不匹配
在我的数据框中,我有 72 个周期和 12 个变量。
在此先感谢您的帮助!
编辑:我意识到我不够精确。我有几个列名称类似于 Impressions1、Impressions2...Impressions72 和 hhi1、hhi2...hhi72。所以 df.columns.str[0],df.columns.str[1] 对我不起作用,因为所有列名的长度都不同。我认为该解决方案可能包含正则表达式,但我不知道该怎么做。有什么想法吗?
df.columns = pd.MultiIndex.from_tuples(list(zip(df.columns.str[0],df.columns.str[1])))
print(df)
A B C
1 2 1 2 1 2
a 0 0 0 0 0 0
b 1 1 1 1 1 1
c 2 2 2 2 2 2
选择:
pd.MultiIndex.from_tuples([tuple(name) for name in df.columns])
或
pd.MultiIndex.from_tuples(map(tuple, df.columns))
您还可以使用 .str.extract
和 from_frame
:
df.columns = pd.MultiIndex.from_frame(df.columns.str.extract('(.)(.)'), names=[None, None])
输出:
A B C
1 2 1 2 1 2
a 0 0 0 0 0 0
b 1 1 1 1 1 1
c 2 2 2 2 2 2
这是真正解决了我的问题的方法:
df.columns = pd.MultiIndex.from_frame(df.columns.str.extract(r'([a-zA-Z]+)([0-9]+)'), names=[None, None])
感谢@Scott Boston 对解决方案的启发!
我是 Python 的新手,到处都找不到我要找的答案。
我有一个具有以下结构的 DataFrame:
df = pd.DataFrame(index=list('abc'), data={'A1': range(3), 'A2': range(3),'B1': range(3), 'B2': range(3), 'C1': range(3), 'C2': range(3)})
df
Out[1]:
A1 A2 B1 B2 C1 C2
a 0 0 0 0 0 0
b 1 1 1 1 1 1
c 2 2 2 2 2 2
其中数字是句点,字母是变量。我想以某种方式转换列,将句点和变量拆分为多索引。所需的输出看起来像这样
A B C
1 2 1 2 1 2
a 0 0 0 0 0 0
b 1 1 1 1 1 1
c 2 2 2 2 2 2
我试过以下方法:
periods = list(range(1, 3))
df.columns = df.columns.str.replace('\d+', '')
df.columns = pd.MultiIndex.from_product([df.columns, periods])
这似乎是将列相乘并引发 ValueError:长度不匹配
在我的数据框中,我有 72 个周期和 12 个变量。
在此先感谢您的帮助!
编辑:我意识到我不够精确。我有几个列名称类似于 Impressions1、Impressions2...Impressions72 和 hhi1、hhi2...hhi72。所以 df.columns.str[0],df.columns.str[1] 对我不起作用,因为所有列名的长度都不同。我认为该解决方案可能包含正则表达式,但我不知道该怎么做。有什么想法吗?
df.columns = pd.MultiIndex.from_tuples(list(zip(df.columns.str[0],df.columns.str[1])))
print(df)
A B C
1 2 1 2 1 2
a 0 0 0 0 0 0
b 1 1 1 1 1 1
c 2 2 2 2 2 2
选择:
pd.MultiIndex.from_tuples([tuple(name) for name in df.columns])
或
pd.MultiIndex.from_tuples(map(tuple, df.columns))
您还可以使用 .str.extract
和 from_frame
:
df.columns = pd.MultiIndex.from_frame(df.columns.str.extract('(.)(.)'), names=[None, None])
输出:
A B C
1 2 1 2 1 2
a 0 0 0 0 0 0
b 1 1 1 1 1 1
c 2 2 2 2 2 2
这是真正解决了我的问题的方法:
df.columns = pd.MultiIndex.from_frame(df.columns.str.extract(r'([a-zA-Z]+)([0-9]+)'), names=[None, None])
感谢@Scott Boston 对解决方案的启发!