我有pandas dataframe一列文本字符串包含逗号分隔值.我想拆分每个CSV字段并为每个条目创建一个新行(假设CSV是干净的,只需要在','上拆分).例如,a应该成为b:
In [7]: a
Out[7]:
var1 var2
0 a,b,c 1
1 d,e,f 2
In [8]: b
Out[8]:
var1 var2
0 a 1
1 b 1
2 c 1
3 d 2
4 e 2
5 f 2
Run Code Online (Sandbox Code Playgroud)
到目前为止,我已经尝试了各种简单的函数,但是.apply当在轴上使用时,该方法似乎只接受一行作为返回值,而我无法.transform工作.我们欢迎所有的建议!
示例数据:
from pandas import DataFrame
import numpy as np
a = DataFrame([{'var1': 'a,b,c', 'var2': 1},
{'var1': 'd,e,f', 'var2': 2}])
b = DataFrame([{'var1': 'a', 'var2': 1},
{'var1': 'b', 'var2': 1},
{'var1': 'c', …Run Code Online (Sandbox Code Playgroud) 我在pandas DataFrame中有一个列,我想在一个空格上拆分.拆分很简单DataFrame.str.split(' '),但我不能从最后一个条目创建一个新列.当我.str.split()在列中获得数组列表时,我不知道如何操作它来为我的DataFrame获取新列.
这是一个例子.该列中的每个条目都包含"符号数据价格",我想分拆价格(最终在一半的情况下删除"p"...或"c").
import pandas as pd
temp = pd.DataFrame({'ticker' : ['spx 5/25/2001 p500', 'spx 5/25/2001 p600', 'spx 5/25/2001 p700']})
temp2 = temp.ticker.str.split(' ')
Run Code Online (Sandbox Code Playgroud)
产量
0 ['spx', '5/25/2001', 'p500']
1 ['spx', '5/25/2001', 'p600']
2 ['spx', '5/25/2001', 'p700']
Run Code Online (Sandbox Code Playgroud)
但temp2[0]只是给出一个列表条目的数组并temp2[:][-1]失败.如何将每个数组中的最后一个条目转换为新列?谢谢!
假设我们从这个简单的表开始,存储在pandas数据帧中:
name age family
0 john 1 1
1 jason 36 1
2 jane 32 1
3 jack 26 2
4 james 30 2
Run Code Online (Sandbox Code Playgroud)
然后我做
group_df = df.groupby('family')
group_df = group_df.aggregate({'name': name_join, 'age': pd.np.mean})
Run Code Online (Sandbox Code Playgroud)
其中groupby()是名称的简单聚合函数:
def name_join(list_names, concat='-'):
return concat.join(list_names)
Run Code Online (Sandbox Code Playgroud)
输出是:
age name
family
1 23 john-jason-jane
2 28 jack-james
Run Code Online (Sandbox Code Playgroud)
现在的问题.
是否有快速,有效的方法从聚合表中获取以下内容?
name age family
0 john 23 1
1 jason 23 1
2 jane 23 1
3 jack 28 2
4 james 28 2
Run Code Online (Sandbox Code Playgroud)
(注意:数字只是示例,我不关心在此具体示例中取平均值后丢失的信息)
我认为我能做到的方式看起来效率不高:
我有以下DataFrame.我想知道是否有可能将"数据"列分成多列.例如,从这个:
ID Date data 6 21/05/2016 A: 7, B: 8, C: 5, D: 5, A: 8 6 21/01/2014 B: 5, C: 5, D: 7 6 02/04/2013 A: 4, D:7 7 05/06/2014 C: 25 7 12/08/2014 D: 20 8 18/04/2012 A: 2, B: 3, C: 3, E: 5, B: 4 8 21/03/2012 F: 6, B: 4, F: 5, D: 6, B: 4
进入这个:
ID Date data A B C D E F 6 21/05/2016 A: 7, B: 8, C: 5, D: …
假设我有一个DataFrame100k行和一列name.我想尽可能有效地将这个名字分成名字和姓氏.我目前的方法是,
def splitName(name):
return pandas.Series(name.split()[0:2])
df[['first', 'last']] = df.apply(lambda x: splitName(x['name']), axis=1)
Run Code Online (Sandbox Code Playgroud)
不幸的DataFrame.apply是,真的很慢.有什么办法让这个字符串操作几乎和操作一样快numpy吗?
谢谢!
我正在使用pandas来管理大量的8字节整数.这些整数作为空格分隔的元素包含在逗号分隔的CSV文件中,并且数组大小约为10000x10000.
Pandas能够快速读取前几列中逗号分隔的数据作为DataFrame,并且还可以轻松地将空格分隔的字符串存储在另一个DataFrame中.当我尝试将表从一列空格分隔的字符串转换为8位整数的DataFrame时,就会遇到麻烦.
我尝试过以下方法:
intdata = pd.DataFrame(strdata.columnname.str.split().tolist(), dtype='uint8')
Run Code Online (Sandbox Code Playgroud)
但内存使用情况令人难以忍受 - 价值10MB的整数消耗2GB内存.我被告知这是语言的限制,在这种情况下我无能为力.
作为一种可能的解决方法,我被建议将字符串数据保存为CSV文件,然后将CSV文件重新加载为以空格分隔的整数的DataFrame.这很好用,但为了避免写入磁盘的速度减慢,我尝试写一个StringIO对象.
这是一个最小的非工作示例:
import numpy as np
import pandas as pd
from cStringIO import StringIO
a = np.random.randint(0,256,(10000,10000)).astype('uint8')
b = pd.DataFrame(a)
c = StringIO()
b.to_csv(c, delimiter=' ', header=False, index=False)
d = pd.io.parsers.read_csv(c, delimiter=' ', header=None, dtype='uint8')
Run Code Online (Sandbox Code Playgroud)
这会产生以下错误消息:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib64/python2.7/site-packages/pandas/io/parsers.py", line 443, in parser_f
return _read(filepath_or_buffer, kwds)
File "/usr/lib64/python2.7/site-packages/pandas/io/parsers.py", line 228, in _read
parser = TextFileReader(filepath_or_buffer, **kwds)
File "/usr/lib64/python2.7/site-packages/pandas/io/parsers.py", line 533, …Run Code Online (Sandbox Code Playgroud) 我有以下pandas数据框:
import pandas as pd
df = pd.DataFrame({ 'gene':["1 // foo // blabla",
"2 // bar // lalala",
"3 // qux // trilil",
"4 // woz // hohoho"], 'cell1':[5,9,1,7], 'cell2':[12,90,13,87]})
df = source_df[["gene","cell1","cell2"]]
Run Code Online (Sandbox Code Playgroud)
它看起来像这样:
gene cell1 cell2
0 1 // foo // blabla 5 12
1 2 // bar // lalala 9 90
2 3 // qux // trilil 1 13
3 4 // woz // hohoho 7 87
Run Code Online (Sandbox Code Playgroud)
我想得到的是:
gene cell1 cell2
0 foo 5 12
1 bar 9 …Run Code Online (Sandbox Code Playgroud) 我知道以下问题:
1.)如何使用熊猫基于多个字符串索引拆分列? 2)如何将一列中的文本分成多行?
我想将它们分成几个新列。假设我有一个看起来像这样的数据框:
id | string
-----------------------------
1 | astring, isa, string
2 | another, string, la
3 | 123, 232, another
Run Code Online (Sandbox Code Playgroud)
我知道使用:
df['string'].str.split(',')
Run Code Online (Sandbox Code Playgroud)
我可以分割一个字符串。但是,下一步,我想像这样有效地将拆分后的字符串放入新列中:
id | string_1 | string_2 | string_3
-----------------|---------------------
1 | astring | isa | string
2 | another | string | la
3 | 123 | 232 | another
---------------------------------------
Run Code Online (Sandbox Code Playgroud)
我可以例如这样做:
for index, row in df.iterrows():
i = 0
for item in row['string'].split():
df.set_values(index, 'string_{0}'.format(i), item)
i = i + 1
Run Code Online (Sandbox Code Playgroud)
但是,如何才能更优雅地达到相同的结果呢?
使用dask数据框将列拆分成多行的有效方法是什么?例如,假设我有一个csv文件,我使用dask读取它来生成以下dask数据帧:
id var1 var2
1 A Z,Y
2 B X
3 C W,U,V
Run Code Online (Sandbox Code Playgroud)
我想将其转换为:
id var1 var2
1 A Z
1 A Y
2 B X
3 C W
3 C U
3 C V
Run Code Online (Sandbox Code Playgroud)
我已经查看了Split(爆炸)pandas数据帧字符串条目的答案,以分隔行和pandas:如何将列中的文本拆分成多行?.
我尝试应用/sf/answers/1198188351/中给出的答案, 但是dask似乎不接受str.split中的expand关键字.
我也尝试应用/sf/answers/2831480851/中建议的向量化方法,但后来发现np.repeat没有在带有整数数组的dask中实现(https://github.com/dask/ dask/issues/2946).
我在熊猫中尝试了一些其他的方法,但它们真的很慢 - 可能用dask更快但我想首先检查一下是否有人用任何特定的方法取得了成功.我正在使用超过1000万行和10列(字符串数据)的数据集.分成行后,它可能会变成大约5000万行.
感谢您对此进行调查!我很感激.
我坚持这个问题,如何按行划分熊猫数据框,
我在列中有类似的数据框,其中值之间用\ r \ n分隔并且它们在一个单元格中,
Color Shape Price
0 Green Rectangle\r\nTriangle\r\nOctangle 10
1 Blue Rectangle\r\nTriangle 15
Run Code Online (Sandbox Code Playgroud)
我需要将此单元格划分为其他单元格的值与其他列相同的多个单元格,例如此处
Color Shape Price
0 Green Rectangle 10
1 Green Triangle 10
2 Green Octangle 10
3 Blue Rectangle 15
4 Blue Tringle 15
Run Code Online (Sandbox Code Playgroud)
如何做得更好?