Получить значения из массива в df на основе функции lengt - PullRequest
0 голосов
/ 05 сентября 2018

Как получить первые n значений из массива в кадре данных,

где n - длина этого же массива - 1: (len [массив] - 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]

Это приводит к следующей ошибке: индексы срезов должны быть целыми числами или отсутствовать или иметь index метод

С помощью более простого метода я могу получить результат в строке, в данном случае в строке 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?

Ответы [ 2 ]

0 голосов
/ 05 сентября 2018
df1 = pd.DataFrame({'Account': ['9', '9.5', '9.6', '9.7', '9.8', '9.9', '0.0.0', '0.0.1', '0.0.2', '0.0.3', '0.0.4']})

df1.assign(
    parent=df1['Account'].str.split('.').apply(lambda x: '.'.join(x[:-1]) or 'null'))
>>> df1
   Account parent
0        9   null
1      9.5      9
2      9.6      9
3      9.7      9
4      9.8      9
5      9.9      9
6    0.0.0    0.0
7    0.0.1    0.0
8    0.0.2    0.0
9    0.0.3    0.0
10   0.0.4    0.0
0 голосов
/ 05 сентября 2018

То, что вы хотите сделать, это

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

Это означает, что вы принимаете все значения от 0 до 2-го последнего значения. Например,

a = [5,3,6,4]

тогда a[:-1] returns [5,3,6]

Более того, вы можете сделать это в самом запуске,

df1['y'] = df1.Account.str.split('.')[:-1]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...