我正在try 使用pd.melt来取消我的数据轴,但到目前为止还没有成功.每一行都是一家企业,数据包含关于该企业和多个 comments 的信息.我希望我的数据每一次审查都是连续的.

我的前150列以15列为一组,每个组列名称共享相同的模式reviews/n/:0 < n < 9.(reviews/0/text,reviews/0/date,...,reviews/9/date). 数据帧中接下来的65列包括关于业务的更多数据(例如,business_id,address),这些数据应该保留为id_Variables.

我目前的数据是这样的:

business_id address reviews/0/date reviews/0/text reviews/1/date reviews/1/text
12345 01 street 1/1/1990 "abc" 2/2/1995 "def"

我的新数据框架应该将每一项审查作为一行,而不是每一项业务,并如下所示:

business_id address review_number review_date review_text
12345 01 street 0 1/1/1990 "abc"
12345 01 street 1 2/2/1995 "def"

我try 使用pd.melt,但无法成功地编写出对我有价值的代码.

推荐答案

你可以用pandas.wide_to_long()做你想做的事.

但是,您需要首先将列从模式reviews/N/COL重命名为reviews/COL/N(或类似的名称),因为wide_to_long()只能基于前缀取消透视,而在列名中,您有一个前缀和一个后缀.

您可以手动完成此操作,例如,使用re模块和适当的正则表达式:

df = df.rename(columns=lambda x: re.sub('reviews/(\d)/(.*)', r'review_\2\1', x))

在此之后,您的数据应该如下所示(请注意更改后的列名):

business_id address review_date0 review_text0 review_date1 review_text1
12345 01 street 1/1/1990 abc 2/2/1995 def

现在,您可以使用pandas.wide_to_long()并使用stubnames参数来指定取消透视时应该分组的列的前缀.

df = pd.wide_to_long(df,
                     stubnames=['review_date','review_text'],
                     i=['business_id', 'address'], 
                     j='review_number')

最后,拨打.reset_index()以达到您所要求的结果.

完整示例:

import re
import pandas as pd

df = pd.DataFrame({'business_id': 12345, 
                   'address': '01 street', 
                   'reviews/0/date': '1/1/1990', 
                   'reviews/0/text': 'abc', 
                   'reviews/1/date': '2/2/1995', 
                   'reviews/1/text': 'def'}, index = [0])

df = df.rename(columns=lambda x: re.sub('reviews/(\d)/(.*)', r'review_\2\1', x))

df = pd.wide_to_long(df,
                     stubnames=['review_date','review_text'],
                     i=['business_id', 'address'], 
                     j='review_number').reset_index()

结果:

business_id address review_number review_date review_text
12345 01 street 0 1/1/1990 abc
12345 01 street 1 2/2/1995 def

Python相关问答推荐

大Pandas 胚胎中产生组合

将整组数组拆分为最小值与最大值之和的子数组

如何删除索引过go 的lexsort深度可能会影响性能?' &>

未删除映射表的行

切片包括面具的第一个实例在内的眼镜的最佳方法是什么?

如何在类和classy-fastapi -fastapi- followup中使用FastAPI创建路由

log 1 p numpy的意外行为

如何将Docker内部运行的mariadb与主机上Docker外部运行的Python脚本连接起来

我如何使法国在 map 中完全透明的代码?

如何使用它?

如何将一个动态分配的C数组转换为Numpy数组,并在C扩展模块中返回给Python

如果值发生变化,则列上的极性累积和

未知依赖项pin—1阻止conda安装""

无法连接到Keycloat服务器

在Python 3中,如何让客户端打开一个套接字到服务器,发送一行JSON编码的数据,读回一行JSON编码的数据,然后继续?

如何使用正则表达式修改toml文件中指定字段中的参数值

Python如何导入类的实例

Python:从目录内的文件导入目录

我怎么才能用拉夫分拣呢?

如何在python tkinter中绑定键盘上的另一个回车?