我有以下DataFrame,其中一列是一个对象(列表类型单元格):
df=pd.DataFrame({'A':[1,2],'B':[[1,2],[1,2]]})
df
Out[458]:
A B
0 1 [1, 2]
1 2 [1, 2]
Run Code Online (Sandbox Code Playgroud)
我的预期输出是:
A B
0 1 1
1 1 2
3 2 1
4 2 2
Run Code Online (Sandbox Code Playgroud)
我该怎么做才能做到这一点?
相关问题
pandas:当单元格内容是列表时,为列表中的每个元素创建一行
好的问题和答案,但只处理一列列表(在我的回答中,自我修复功能将适用于多列,也接受的答案是使用最耗时apply,不推荐,检查更多信息我应该什么时候想要在我的代码中使用pandas apply()?)
这是一个自我回答的QnA,旨在指导用户应用的缺陷和好处.
我已经看到很多关于Stack Overflow问题的答案涉及使用apply.我也看到用户评论他们说" apply很慢",应该避免".
我已经阅读了很多关于性能主题的文章,解释apply很慢.我还在文档中看到了一个关于如何apply简单地传递UDF的便利函数的免责声明(现在似乎无法找到).因此,普遍的共识是,apply如果可能,应该避免.但是,这引发了以下问题:
apply是如此糟糕,那为什么它在API中呢?apply- 免费?apply是不错的(比其他可能的解决方案更好)?我有一个包含订单数据的数据框,每个订单都有多个包存储为逗号分隔的字符串[ package&package_code]列
我想分割包数据并为每个包创建一行,包括其订单详细信息
以下是输入数据框的示例:
import pandas as pd
df = pd.DataFrame({"order_id":[1,3,7],"order_date":["20/5/2018","22/5/2018","23/5/2018"], "package":["p1,p2,p3","p4","p5,p6"],"package_code":["#111,#222,#333","#444","#555,#666"]})
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)
上面的代码可以工作,但速度很慢
有什么聪明的方法吗?
谢谢
我在熊猫中有一个像这样的数据框:
id info
1 [1,2]
2 [3]
3 []
Run Code Online (Sandbox Code Playgroud)
我想把它分成不同的行,如下所示:
id info
1 1
1 2
2 3
3 NaN
Run Code Online (Sandbox Code Playgroud)
我怎样才能做到这一点?
我正在将多个JSON对象读入一个DataFrame.问题是某些列是列表.此外,数据非常大,因此我不能使用互联网上的可用解决方案.它们非常慢并且内存效率低
以下是我的数据的样子:
df = pd.DataFrame({'A': ['x1','x2','x3', 'x4'], 'B':[['v1','v2'],['v3','v4'],['v5','v6'],['v7','v8']], 'C':[['c1','c2'],['c3','c4'],['c5','c6'],['c7','c8']],'D':[['d1','d2'],['d3','d4'],['d5','d6'],['d7','d8']], 'E':[['e1','e2'],['e3','e4'],['e5','e6'],['e7','e8']]})
A B C D E
0 x1 [v1, v2] [c1, c2] [d1, d2] [e1, e2]
1 x2 [v3, v4] [c3, c4] [d3, d4] [e3, e4]
2 x3 [v5, v6] [c5, c6] [d5, d6] [e5, e6]
3 x4 [v7, v8] [c7, c8] [d7, d8] [e7, e8]
Run Code Online (Sandbox Code Playgroud)
这是我的数据形状:(441079,12)
我想要的输出是:
A B C D E
0 x1 v1 c1 d1 e1
0 x1 v2 c2 d2 e2
1 x2 v3 c3 d3 e3 …Run Code Online (Sandbox Code Playgroud) 我有一个包含许多键/值列的数据框,而键和值是分隔的列.
import pandas as pd
values = [['John', 'somekey1', 'somevalue1', 'somekey2', 'somevalue2']]
df = pd.DataFrame(values, columns=['name', 'key1', 'value1', 'key2', 'value2'])
Run Code Online (Sandbox Code Playgroud)
备注:原始数据将包含更多前面的列,而不仅仅是名称.它不仅仅包含两个键/值列.
我想要实现的是这样的结果:
values = [
['John', 'somekey1', 'somevalue1'],
['John', 'somekey2', 'somevalue2']
]
df = pd.DataFrame(values, columns=['name', 'key', 'value'])
Run Code Online (Sandbox Code Playgroud)
在那里,我想将所有键/值列连接到列表或字典中,而不是爆炸该列表/字典.我在pd.melt上找到了这个不错的帖子,但我的问题是,我不知道确切的id_var列在前面.因此我尝试了pd.Series.stack,它为键/值列提供了正确的结果,但是缺少原始数据中的其他列.任何的想法?这是我试过的:
# generates: [(somekey1, somevalue1), (somekey2, somevalue2)]
df['pairs'] = df.apply(lambda row: [(row['key1'],row['value1']), (row['key2'], row['value2'])], axis=1)
# unstacks the list, but drops all other columns
df['pairs'].apply(pd.Series).stack().reset_index(drop=True).to_frame('pairs')
Run Code Online (Sandbox Code Playgroud)