Loop, iloc и loc в Dataframe? - PullRequest
       0

Loop, iloc и loc в Dataframe?

0 голосов
/ 28 декабря 2018

Привет, ребята, я новичок в python, сейчас я начинаю работать с некоторыми библиотеками, такими как Pandas и Numpy.Недавно мой учитель дал мне это упражнение, и я не знаю, какой метод мне следует использовать.Подробности показаны ниже:

df1 = pd.DataFrame({'col1': [0, 1, 1, 0, 3],
               'col2': [23, 4, 1, 1, 3], 
               'col3': [0, 5, 2, 1, 1],
               'col4': [1, 2, 6, 4, 0],
               'col5': [4, 15, 0, 2, 5],
               'loc': [1, 4, 2, 3, 2]}) 

1) col1 - col5: случайное число

2) loc: местоположение значения.

3) Вычислить «val», который возвращает значение каждого столбца, местоположения указаны в «loc».

Пример: в строке 0, loc = 1, val = 23. В строке1 loc = 4, val = 15 и т. Д.

Результат должен быть таким:

df = pd.DataFrame({'col1': [0, 1, 1, 0, 3],
               'col2': [23, 4, 1, 1, 3], 
               'col3': [0, 5, 2, 1, 1],
               'col4': [1, 2, 6, 4, 0],
               'col5': [4, 15, 0, 2, 5],
               'loc': [1, 4, 2, 3, 2],
                'val': [23, 15, 2, 4, 1]})

Я пробовал что-то вроде iloc и loc для вычисления 'val'.Однако, когда размер данных увеличивается, я больше не мог использовать этот метод.Есть ли какой-нибудь более быстрый способ вычислить «val»Нужно ли использовать цикл для вычисления 'val'?

df1 = df['loc']
df.iloc[0,df1[0]]
df.iloc[1,df1[1]]
df.iloc[2,df1[2]]

PS: Извините за мой плохой английский, но я действительно не знаю, как объяснить это упражнение на английском, я просто стараюсь изо всех сил:(

Ответы [ 3 ]

0 голосов
/ 28 декабря 2018

Для этого вы можете использовать цикл for, где вы увеличиваете значение до диапазона длины столбца 'loc' (например).С помощью .iloc вы можете выбрать правильную строку и значение из столбца 'loc'.

Я не собираюсь предлагать вам полное решение, но что-то вроде:

vals = [] # Create an empty list to hold the requested values
for i in range(len(df['loc'])): # Loop over the rows ('i')
    val = df.iloc[i, df['loc'][i]] # Get the requested value from row 'i'
    vals.append(val) # append value to list 'vals'
df['value'] = vals # Add list 'vals' as a new column to the DataFrame

отредактировано, чтобы завершить ответ ...

0 голосов
/ 28 декабря 2018

Цикл по серии с индексом, затем с помощью pd.iat [row int pos, column int pos] вы получите точное значение, из массива значений вы можете создать новую серию.

result = []
for index, row in df1['loc'].iteritems():
     result.append(df1.iat[index, row])
df1['val'] = result
0 голосов
/ 28 декабря 2018

Используйте индексирование с нуля, особенно если важна производительность:

df1['value'] = df1.values[np.arange(len(df1)), df1['loc']]
print (df1)
   col1  col2  col3  col4  col5  loc  value
0     0    23     0     1     4    1     23
1     1     4     5     2    15    4     15
2     1     1     2     6     0    2      2
3     0     1     1     4     2    3      4
4     3     3     1     0     5    2      1

Производительность :

#5000 rows
df1 = pd.concat([df1] * 1000, ignore_index=True)
In [73]: %timeit df1['value'] = df1.values[np.arange(len(df1)), df1['loc']]
266 µs ± 8.06 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

In [74]: %%timeit
    ...: result = []
    ...: for index, row in df1['loc'].iteritems():
    ...:      result.append(df1.iat[index, row])
    ...: df1['val'] = result
    ...: 
64 ms ± 753 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)

In [75]: %timeit df1['value'] = df1.apply(lambda x: x.iloc[x['loc']], axis = 1)
243 ms ± 11.9 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...