- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一个来自一个文件的数据框,我有产品和价格。我每天都有记录客户购买的所有产品的文件。所以列的长度取决于一个客户购买的最大产品数量。一开始,我有一个这样的文件:
date conv product Prices
01/2016 'part ' A|B|C|E|F 15|20|30|40|50
01/2016 'Pro' D|B 10|10
然后我用“|”分割那个文件,然后我在我的新 df 上有 5 列。因为当天一位客户购买的产品数量最多为 5。
最终的 DataFrame 给出:
Date Conv Product_1 product_2 ... product_n price_1 price_2 ... price_n
01/2016 'Part' A B C 15 20 30
01/2016 'Pro' B D C 10 10 20
02/2016 'Part' E A B 25 5 10
我想转置变量“Product_1 ...product_n”和“price 1 ... price_n”。并获得一个新的 df :
Date Conv Product price
01/2016 'Part' A 15
01/2016 'Part' B 20
01/2016 'Part' C 30
01/2016 'Pro' B 10
01/2016 'Pro' D 10
01/2016 'Pro' C 20
02/2016 'Part' E 25
02/2016 'Part' A 5
02/2016 'Part' B 10
困难在于转置变量和复制变量日期和转换。
我认为使用 SAS
我们可以通过代码获得:
Proc transpose ;
Data = DF;
VAR product_1-product_4 price1_price_4;
BY Date Conv;
COPY Date Conv;
但是在 Python 上我找不到等价物。
有人知道我该怎么做吗?
我尝试使用:df.transpose
但这不是我想要的结果。
最佳答案
您可以先使用startswith
通过list
comprehension 选择列,然后使用pd.lreshape
:
prods = ([col for col in df.columns if col.startswith('product_')])
prices = ([col for col in df.columns if col.startswith('price_')])
print (prods)
['product_1', 'product_2', 'product_n']
print (prices)
['price_1', 'price_2', 'price_n']
df1 = pd.lreshape(df, {'product' : prods, 'price' : prices})
print (df1)
Conv Date price product
0 'Part' 01/2016 15 A
1 'Pro' 01/2016 10 B
2 'Part' 02/2016 25 E
3 'Part' 01/2016 20 B
4 'Pro' 01/2016 10 D
5 'Part' 02/2016 5 A
6 'Part' 01/2016 30 C
7 'Pro' 01/2016 20 C
8 'Part' 02/2016 10 B
通过更具体的问题进行编辑:
#new df1 from column product
df1 = (df['product'].str.split('|', expand=True))
#add prod_ to column names
prods = df1.columns = ['prod_' + str(col) for col in df1.columns]
#new df2 from column Prices
df2 = (df['Prices'].str.split('|', expand=True))
#add part_ to column names
prices = df2.columns = ['part_' + str(col) for col in df2.columns]
#join all together
df3 = (pd.concat([df[['date','conv']], df1, df2], axis=1))
#reshape
print (pd.lreshape(df3, {'product' : prods, 'price' : prices}))
conv date price product
0 'part' 01/2016 15 A
1 'pro' 01/2016 10 D
2 'part' 01/2016 20 B
3 'pro' 01/2016 10 B
4 'part' 01/2016 30 C
5 'part' 01/2016 40 E
6 'part' 01/2016 50 F
join
的另一种解决方案:
#create dataframe and stack, drop level of multiindex
s1 = (df['product'].str.split('|', expand=True)).stack()
s1.index = s1.index.droplevel(-1)
s1.name = 'product'
s2 = (df['Prices'].str.split('|', expand=True)).stack()
s2.index = s2.index.droplevel(-1)
s2.name = 'price'
#remove original columns
df = df.drop(['product','Prices'], axis=1)
#join series to dataframe
df1 = (df.join(s1).reset_index(drop=True))
df2 = (df.join(s2).reset_index(drop=True))
#join all togehter
print (pd.concat([df1, df2[['price']]], axis=1))
date conv product price
0 01/2016 'part' A 15
1 01/2016 'part' B 20
2 01/2016 'part' C 30
3 01/2016 'part' E 40
4 01/2016 'part' F 50
5 01/2016 'pro' D 10
6 01/2016 'pro' B 10
时间:
In [598]: %timeit (a(df))
100 loops, best of 3: 10.6 ms per loop
In [599]: %timeit (b(df_a))
100 loops, best of 3: 14.1 ms per loop
计时代码:
import pandas as pd
df = pd.DataFrame({'date': {0: '01/2016', 1: '01/2016'},
'conv': {0: "'part'", 1: "'pro'"},
'Prices': {0: '15|20|30|40|50', 1: '10|10'},
'product': {0: 'A|B|C|E|F', 1: 'D|B'}},
columns =['date','conv','product','Prices'])
df = pd.concat([df]*1000).reset_index(drop=True)
print (df)
df_a = df.copy()
def a(df):
df1 = (df['product'].str.split('|', expand=True))
prods = df1.columns = ['prod_' + str(col) for col in df1.columns]
df2 = (df['Prices'].str.split('|', expand=True))
prices = df2.columns = ['part_' + str(col) for col in df2.columns]
df3 = (pd.concat([df[['date','conv']], df1, df2], axis=1))
return (pd.lreshape(df3, {'product' : prods, 'price' : prices}))
def b(df):
s1 = (df['product'].str.split('|', expand=True)).stack()
s1.index = s1.index.droplevel(-1)
s1.name = 'product'
s2 = (df['Prices'].str.split('|', expand=True)).stack()
s2.index = s2.index.droplevel(-1)
s2.name = 'price'
df = df.drop(['product','Prices'], axis=1)
df1 = (df.join(s1).reset_index(drop=True))
df2 = (df.join(s2).reset_index(drop=True))
return (pd.concat([df1, df2[['price']]], axis=1))
print (a(df))
print (b(df_a))
编辑:
lreshape
现在没有记录,但将来可能会被删除(with pd.wide_to_long too)。
可能的解决方案是将所有 3 个函数合并为一个 - 也许是 melt
,但现在还没有实现。也许在一些新版本的 Pandas 中。然后我的答案将被更新。
关于python - 根据许多变量转置 Python Dataframe,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37407213/
我已经在标准 WPF 控件中实现了一个报告,并且还实现了一个 DocumentPaginator获取这些控件并将它们转换为用于打印的文档。 我还实现了一些使用文档分页器将页面呈现为图像并使用 PDFS
在 C# 中,我有以下代码: public static string GetHashCode(string p) { var a = new SHA256Managed();
您好,我正在尝试在编码后将我的 mysqli 数据库输出到一个 js 文件,我用 json_encode 对其进行编码没有任何问题,但是如何将其放入 js 文件中(每次更新时更新) mysqli数据已
我需要将 select 从 JS 传递到 HTML。 select 应该包含来自 PHP 的 option。 所以,首先我有一个 HTML div,我将在其中添加来自 JS 的内容。
我有一个相当大且复杂的 SVG 代码,它根据页面信息使用 JavaScript 和 jQuery 动态生成。 然后我有一个 AJAX 帖子保存。 我无法将其转换为正确发布图像数据? var canva
我想将我的本地日期 ([NSDate date]) 转换为 GMT 以创建一个 JSON 字符串 (/Date(1324435876019-0000)/)。 当我将时钟设置为 EST 时区时,我的代码
1. 原始单据与实体之间的关系 可以是一对1、一对多、多对多的关系。在一般情况下,它们是一对一的关系:即一张原始单据对应且只对应一个实体。在特殊情况下,它们可能是一对多或多对一的关系,即一张原
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界. 这篇CFSDN的博客文章服务器五大相关基础知识【转】由作者收集整理,如果你对这篇文章有兴趣,记得
Google Apps 脚本 - Gmail 是否会实现 GmailMessage (GmailThread) .getAsPdf() 方法?预期输出与 Gmail 中可用的打印为 PDF 的输出相同
有一个需求是要在一个云监控的状态值中存储多个状态(包括可同时存在的各种异常、警告状态)使用了位运算机制在一个int型中存储。 现在监控日志数据量非常大(亿级别)需要对数据按每小时、每天进行聚合,供
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界. 这篇CFSDN的博客文章1张图看懂RAID功能,6张图教会配置服务器【转】由作者收集整理,如果你
我正在使用 FFMPeg(版本 ffmpeg-20170330-ad7aff0-win64-static)将 RTSP 转换为 .m3u8。 命令是: ffmpeg -rtsp_transport t
我有一个 JTree使用 DefaultTreeModel 的对象作为模型,我添加/删除与该模型相关的节点。 此时,我需要在图形界面中显示树结构,例如 JPanel .如何映射 DefaultTree
我当前正在接收一个文件并将其存储到 NSString 中。然后,我从字符串中创建一个数组并将其呈现在 TableView 中。这在一定程度上有效。我目前收到的数据如下: 公司名称|帐户代码\r\n公司
我需要创建 NSImage cocoa 对象的 base64 字符串表示形式。处理这个问题的最佳方法是什么,苹果文档似乎在这个主题上有点短(或者我只是找不到它)。 Base64 编码从外面看起来相当复
JS 中的 .toISOString() 函数给我这样的字符串: 2015-06-14T20:00:00:000Z 我需要它是这样的: 2015-06-14T20:00:00Z JS 中是否有其他函数
我正在尝试使用 JavaScript 转换 COLORREF: COLORREF : When specifying an explicit RGB color, the COLORREF value
我在这里遇到了这个代码的问题,只是想制作一个小计算器: 打包申请; import javafx.event.ActionEvent; import javafx.scene.control.TextF
我想要做的是能够通过本地PC上的USS通过sshfs挂载主机上的一些文件。我可以做到这一点,但 sshfs 不能直接完成从 EBCDIC 到 ascii/unicode 的转换。有没有我可以设置的标志
我正在尝试在 python 中将一堆 Visio 文件转换为 pdf。我已经引用了这个.doc to pdf using python并编写了以下代码: import comtypes.client
我是一名优秀的程序员,十分优秀!