首页 > 解决方案 > 基于 lengt 函数从 df 内的数组中检索值

问题描述

如何从数据框中的数组中检索前 n 个值,

其中 n 是同一个数组的长度 - 1: (len[array] - 1)?

为了澄清我的目标是我到目前为止的代码,来自我的 jupyter 笔记本:

import numpy as np
import pandas as pd
#load csv into pandas data frame
df1 = pd.read_csv(r"accounts.csv")
#define the range for clarity
xi = 60
xn = 70
df1['splt_acc'] = df1.Account.str.split('.')
df1['len'] = df1.splt_acc.apply(lambda x: len(x)-1).astype(int)
df1['parent'] = df1.splt_acc.str.join('.')
pd.DataFrame(df1)[xi:xn]

显示以下

    Account Rubriek       splt_acc  len parent
60  9.5     Inkoop        [9, 5]    1   9.5
61  9.6     Overige res.. [9, 6]    1   9.6
62  9.7     Buitengewon.. [9, 7]    1   9.7
63  9.8     Incidentele.. [9, 8]    1   9.8
64  9.9     Vennootschap. [9, 9]    1   9.9
65  0.0.0   Terreinen     [0, 0, 0] 2   0.0.0
66  0.0.1   Gebouwen      [0, 0, 1] 2   0.0.1
67  0.0.2   Verbouwingen  [0, 0, 2] 2   0.0.2
68  0.0.3   Machines      [0, 0, 3] 2   0.0.3
69  0.0.4   Gereedschappen[0, 0, 4] 2   0.0.4

接下来我想要的是:

df1['y'] = df1.splt_acc.apply(lambda splt_acc: splt_acc[0:df1.len])
pd.DataFrame(df1)[xi:xn]

这会导致以下错误:切片索引必须是整数或无或具有索引方法

使用更简单的方法,我可以获得每行的结果,在本例中为第 60 行:

account = df1['Account'][60]
x = account.split('.')

if len(x) - 1 == 0:
    y = 'null'
else:
    y = x[0:(len(x)-1)]

print(y)

['9']

if y == 'null':
    parent = 'null'
else:
    parent = ".".join(str(x) for x in y)

print(parent)

9

但问题是,我怎样才能在我的 DataFrame 中得到相同的结果?

标签: pythonpandas

解决方案


你想做的是,

df1['y'] = df1.splt_acc.apply(lambda x: x[:-1])

这意味着您正在获取从 0 到倒数第二个值的所有值。例如,

a = [5,3,6,4]

然后,a[:-1] returns [5,3,6]

此外,您可以在开始时执行此操作,

df1['y'] = df1.Account.str.split('.')[:-1]

推荐阅读