pandas 将n列转换为行

jobtbby3  于 2023-01-01  发布在  其他
关注(0)|答案(2)|浏览(119)

我正在寻找一种方法来分解数据从一个单行在一个Pandasdf
我的数据如下所示
编辑:n 代表一个未指定的数字,例如,在我的工作数据集中,我有8个图,给我8 x 2 = 16列,我想转换。

data = {
        'key':['k1', 'k2'],
        'plot_name_1':['name', 'name'],
        'plot_area_1':[1,2],
        'plot_name_2':['name', 'name'],
        'plot_area_2':[1,2],
        'plot_name_n':['name', 'name'],
        'plot_area_n':[1,2]
       }

df = pd.DataFrame(data)

我想在这里结束,添加一个额外的列来标识地块编号:

data = {
        'key':['k1','k1','k1', 'k2', 'k2', 'k2'],
        'plot_number':['1', '2', 'n','1', '2', 'n'],
        'plot_name':['name', 'name','name', 'name','name', 'name'],
        'plot_area':[1,2,1,2,1,2],
       }

df = pd.DataFrame(data)

z31licg0

z31licg01#

pd.wide_to_long可以做到这一点:

In [160]: pd.wide_to_long(df, stubnames=["plot_name", "plot_area"],
                          i="key", j="plot_number",
                          sep="_", suffix=r"(?:\d+|n)").reset_index()
Out[160]:
  key plot_number plot_name  plot_area
0  k1           1      name          1
1  k2           1      name          2
2  k1           2      name          1
3  k2           2      name          2
4  k1           n      name          1
5  k2           n      name          2

其中

  • “stubnames”是要捕获的常用列前缀名称
  • “sep”是这些前缀后面的分隔符
  • “_”在您的情况下
  • “suffix”是分隔符后面的内容
  • 一个或多个数字,或您的情况下的文字“n”;如果“n”是符号,则可以使用suffix=r"\d+"
  • “i”参数是“索引”(即标识符变量)
  • “j”表示在其下聚集后缀的名称。

顺便说一句,当可能有多个后缀时,我们需要对正则表达式进行paranthesize,因为Pandas在构造正则表达式时使用了suffix

regex = rf"^{re.escape(stub)}{re.escape(sep)}{suffix}$"

我们可以看到suffix是直接插值的,其中的一个交流发电机(即|)将看到左边不仅是\d+,而且也是来自stub & sep的。

cbeh67ev

cbeh67ev2#

一个选项是使用pivot_longger从pyjanitor进行整形,使用正则表达式捕获组:

# pip install pyjanitor
import pandas as pd
import janitor

(df
.pivot_longer(
    index='key', 
    names_to = ('.value', 'plot_number'), 
    names_pattern = r"(.+)_(.+)")
)
  key plot_number plot_name  plot_area
0  k1           1      name          1
1  k2           1      name          2
2  k1           2      name          1
3  k2           2      name          2
4  k1           n      name          1
5  k2           n      name          2

.value确定列的哪些部分保留为标题

相关问题