我有一个数据框,其中一些单元格包含多个值的列表.我不想在单元格中存储多个值,而是扩展数据框,以便列表中的每个项目都有自己的行(在所有其他列中具有相同的值).所以,如果我有:
import pandas as pd
import numpy as np
df = pd.DataFrame(
{'trial_num': [1, 2, 3, 1, 2, 3],
'subject': [1, 1, 1, 2, 2, 2],
'samples': [list(np.random.randn(3).round(2)) for i in range(6)]
}
)
df
Out[10]:
samples subject trial_num
0 [0.57, -0.83, 1.44] 1 1
1 [-0.01, 1.13, 0.36] 1 2
2 [1.18, -1.46, -0.94] 1 3
3 [-0.08, -4.22, -2.05] 2 1
4 [0.72, 0.79, 0.53] 2 2
5 [0.4, -0.32, -0.13] 2 3
Run Code Online (Sandbox Code Playgroud)
如何转换为长格式,例如:
subject trial_num sample sample_num …Run Code Online (Sandbox Code Playgroud) 我试图在6参数函数的参数空间上运行以研究它的数值行为,然后再尝试做任何复杂的事情,所以我正在寻找一种有效的方法来做到这一点.
给定6-dim numpy数组作为输入,我的函数采用浮点值.我最初尝试做的是:
首先,我创建了一个函数,它接受2个数组并生成一个数组,其中包含来自两个数组的所有值组合
from numpy import *
def comb(a,b):
c = []
for i in a:
for j in b:
c.append(r_[i,j])
return c
Run Code Online (Sandbox Code Playgroud)
然后我习惯reduce()将它应用于相同数组的m个副本:
def combs(a,m):
return reduce(comb,[a]*m)
Run Code Online (Sandbox Code Playgroud)
然后我评估我的功能如下:
values = combs(np.arange(0,1,0.1),6)
for val in values:
print F(val)
Run Code Online (Sandbox Code Playgroud)
这有效,但它太慢了.我知道参数的空间很大,但这不应该太慢.在这个例子中我只抽取了10 6(一百万)个点,并且创建数组花了超过15秒values.
你知道用numpy做这个更有效的方法吗?
F如果有必要,我可以修改函数获取它的参数的方式.
我希望将包含列表的pandas单元格转换为每个值的行.
所以,拿这个:
如果我想解压并堆叠'nearest_neighbors"列中的值,以便每个值都是每个'对手'索引中的一行,我最好怎么做呢?是否有适合像这样的操作的pandas方法这个?我只是不知道.
先谢谢你,伙计们.
这是一个自我回答的QnA,旨在指导用户应用的缺陷和好处.
我已经看到很多关于Stack Overflow问题的答案涉及使用apply.我也看到用户评论他们说" apply很慢",应该避免".
我已经阅读了很多关于性能主题的文章,解释apply很慢.我还在文档中看到了一个关于如何apply简单地传递UDF的便利函数的免责声明(现在似乎无法找到).因此,普遍的共识是,apply如果可能,应该避免.但是,这引发了以下问题:
apply是如此糟糕,那为什么它在API中呢?apply- 免费?apply是不错的(比其他可能的解决方案更好)?我在熊猫中有这样的数据框:
column1 column2
[a,b,c] 1
[d,e,f] 2
[g,h,i] 3
Run Code Online (Sandbox Code Playgroud)
column1 column2
a 1
b 1
c 1
d 2
e 2
f 2
g 3
h 3
i 3
Run Code Online (Sandbox Code Playgroud)
如何处理这些数据?
假设我有以下Pandas Dataframe:
df = pd.DataFrame({"a" : [1,2,3], "b" : [[1,2],[2,3,4],[5]]})
a b
0 1 [1, 2]
1 2 [2, 3, 4]
2 3 [5]
Run Code Online (Sandbox Code Playgroud)
我如何"取消堆叠""b"列中的列表以将其转换为数据帧:
a b
0 1 1
1 1 2
2 2 2
3 2 3
4 2 4
5 3 5
Run Code Online (Sandbox Code Playgroud) 我有一个像这样的pandas数据框:
COL data
line1 [A,B,C]
Run Code Online (Sandbox Code Playgroud)
其中数据列中的项可以是列表,也可以是逗号分隔的元素.有一种简单的获取方式:
COL data
line1 A
line1 B
line1 C
Run Code Online (Sandbox Code Playgroud)
我可以遍历列表并通过python手动复制行,但有没有一些神奇的熊猫技巧呢?关键是如何自动复制行.
谢谢!
我有:
df = pd.DataFrame({'col1': ['asdf', 'xy', 'q'], 'col2': [1, 2, 3]})
col1 col2
0 asdf 1
1 xy 2
2 q 3
Run Code Online (Sandbox Code Playgroud)
我想从字符串中col1取出每个字母的"组合产品" ,每个元素都在int中col2.即:
col1 col2
0 a 1
1 s 1
2 d 1
3 f 1
4 x 2
5 y 2
6 q 3
Run Code Online (Sandbox Code Playgroud)
目前的方法:
from itertools import product
pieces = []
for _, s in df.iterrows():
letters = list(s.col1)
prods = list(product(letters, [s.col2]))
pieces.append(pd.DataFrame(prods))
pd.concat(pieces)
Run Code Online (Sandbox Code Playgroud)
任何更有效的解决方法?
我想做这个 :
# input:
A B
0 [1, 2] 10
1 [5, 6] -20
# output:
A B
0 1 10
1 2 10
2 5 -20
3 6 -20
Run Code Online (Sandbox Code Playgroud)
每列A的值都是一个列表
df = pd.DataFrame({'A':[[1,2],[5,6]],'B':[10,-20]})
df = pd.DataFrame([[item]+list(df.loc[line,'B':]) for line in df.index for item in df.loc[line,'A']],
columns=df.columns)
Run Code Online (Sandbox Code Playgroud)
上面的代码可以工作,但速度很慢
有什么聪明的方法吗?
谢谢