Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
基于整数数组的python数据帧切片字符串_Python_Pandas_Dataframe - Fatal编程技术网

基于整数数组的python数据帧切片字符串

基于整数数组的python数据帧切片字符串,python,pandas,dataframe,Python,Pandas,Dataframe,我想根据序列中的整数对数据帧(只包含字符串)中的列进行切片。以下是一个例子: data = pandas.DataFrame(['abc','scb','dvb']) indices = pandas.Series([0,1,0]) 然后应用一些函数,得到以下结果: 0 0 a 1 c 2 d 您可以使用以下矢量化方法: In [191]: [tuple(x) for x in indices.reset_index().values] Out[191]: [(0, 0), (1

我想根据序列中的整数对数据帧(只包含字符串)中的列进行切片。以下是一个例子:

data = pandas.DataFrame(['abc','scb','dvb'])
indices = pandas.Series([0,1,0])
然后应用一些函数,得到以下结果:

   0
0  a
1  c
2  d

您可以使用以下矢量化方法:

In [191]: [tuple(x) for x in indices.reset_index().values]
Out[191]: [(0, 0), (1, 1), (2, 0)]

In [192]: data[0].str.extractall(r'(.)') \
                 .loc[[tuple(x) for x in indices.reset_index().values]]
Out[192]:
         0
  match
0 0      a
1 1      c
2 0      d

In [193]: data[0].str.extractall(r'(.)') \
                 .loc[[tuple(x) for x in indices.reset_index().values]] \
                 .reset_index(level=1, drop=True)
Out[193]:
   0
0  a
1  c
2  d
说明:

In [194]: data[0].str.extractall(r'(.)')
Out[194]:
         0
  match
0 0      a
  1      b
  2      c
1 0      s
  1      c
  2      b
2 0      d
  1      v
  2      b

In [195]: data[0].str.extractall(r'(.)').loc[ [ (0,0), (1,1) ] ]
Out[195]:
         0
  match
0 0      a
1 1      c

Numpy解决方案:

In [259]: a = np.array([list(x) for x in data.values.reshape(1, len(data))[0]])

In [260]: a
Out[260]:
array([['a', 'b', 'c'],
       ['s', 'c', 'b'],
       ['d', 'v', 'b']],
      dtype='<U1')

In [263]: pd.Series(a[np.arange(len(data)), indices])
Out[263]:
0    a
1    c
2    d
dtype: object
[259]中的
:a=np.array([list(x)表示数据中的x.values.reformate(1,len(data))[0]]
在[260]中:a
出[260]:
数组(['a','b','c'],
[s',c',b'],
[d',v',b']],

dtype='您可以事先使用python操作列表

l1 = ['abc','scb','dvb']
l2 = [0,1,0]
l3 = [l1[i][l2[i]] for i in range(len(l1))]
你得到l3作为

['a', 'c', 'd']
现在将其转换为数据帧

data = pd.DataFrame(l3)

您可以获得所需的数据帧

谢谢,在我正在应用它的更大数据集上运行得非常快。这是一个有趣的想法。如果您可以使用numpy实现它-它可能非常快…还不是numpy极客,但让我试试。感谢您的回答:)谢谢,这似乎是为了更具普遍性的解决方案。我这样说是因为我有另一种情况,我可能希望得到一个范围切片(即,我希望最终输出数据帧中的每一行有多个字母)。我找不到一种方法来适应@MaxU的另一种解决方案