相关疑难解决方法(0)

将pandas数据帧字符串条目拆分(爆炸)到单独的行

我有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)

python numpy dataframe pandas

170
推荐指数
9
解决办法
9万
查看次数

在pandas DataFrame中的列上的.str.split()操作之后获取最后一个"列"

我在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]失败.如何将每个数组中的最后一个条目转换为新列?谢谢!

python string split pandas

50
推荐指数
5
解决办法
5万
查看次数

大熊猫的.groupby对面是否有"取消组合"操作?

假设我们从这个简单的表开始,存储在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)

(注意:数字只是示例,我不关心在此具体示例中取平均值后丢失的信息)

我认为我能做到的方式看起来效率不高:

  1. 创建空数据帧 …

python group-by pandas pandas-groupby

17
推荐指数
3
解决办法
3万
查看次数

Pandas,DataFrame:将一列拆分成多列

我有以下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: …

python dataframe pandas

12
推荐指数
2
解决办法
2210
查看次数

在pandas DataFrame中快速应用字符串操作

假设我有一个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吗?

谢谢!

python pandas

10
推荐指数
1
解决办法
1万
查看次数

pandas无法从大型StringIO对象中读取

我正在使用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)

python csv stringio pandas cstringio

9
推荐指数
1
解决办法
5191
查看次数

如何通过分隔符拆分pandas列并选择首选元素作为替换

我有以下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)

python pandas

6
推荐指数
1
解决办法
6736
查看次数

如何使用Pandas Python将字符串拆分为数据帧中的几列?

我知道以下问题:

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)

但是,如何才能更优雅地达到相同的结果呢?

python pandas

5
推荐指数
1
解决办法
2949
查看次数

Dask数据帧 - 根据分隔符将列拆分为多行

使用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万行.

感谢您对此进行调查!我很感激.

python performance pandas dask

5
推荐指数
1
解决办法
875
查看次数

在熊猫数据框中拆分行

我坚持这个问题,如何按行划分熊猫数据框,

我在列中有类似的数据框,其中值之间用\ 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)

如何做得更好?

python pandas

5
推荐指数
1
解决办法
150
查看次数