как работает "разложить ячейки, содержащие списки, в свои переменные в пандах" - PullRequest
0 голосов
/ 06 января 2019

Здесь показывает, как развернуть ячейки, содержащие списки, в свои переменные в пандах. Также есть это решение:

df.apply(lambda x: pd.Series(x['tags']),axis=1)

Но я не понимаю, как это работает. Любой может это объяснить.

Ответы [ 2 ]

0 голосов
/ 06 января 2019

apply позволяет передавать все строки (axis = 1) или столбцы (axis = 0) объекта DataFrame в функцию, которая задана в качестве параметра для функции apply. В основном ты пишешь

DataFrame.apply(function, axis)

, где функция может быть предопределена как функция суммирования с суммой, или вы можете объявить лямбда-выражение.

В этом случае каждая строка "x" в DataFrame "df" передается в функцию "pd.Series (x ['tags'])" как объект Series. Для каждой строки значение столбца тегов будет использоваться для создания нового объекта Series.

Если вы сделаете это для всех строк, вы получите набор объектов из одной серии, которые в конце используются для создания нового DataFrame.

0 голосов
/ 06 января 2019

Это означает преобразование каждого значения столбца tags в Series, которые преобразуются в DataFrame - это соответствует Series вместе. axis=1 означает процессы по строкам, где каждая строка преобразуется в Серию, поэтому для выбора tags.

необходимо x['tags'].

Также возможно создание пользовательской функции для лучшей проверки каждого шага:

def f(x):
    #each row is convert to Series
    print (x)
    #select row tags
    print (x['tags'])

    #convert list to Series
    return pd.Series(x['tags'])

tags = df.apply(f,axis=1)
print (tags)

Если важна производительность и больше DataFrame, лучше использовать:

tags = pd.DataFrame(df['tags'].values.tolist())
print (tags)
       0     1      2
0  apple  pear  guava
1  truck   car  plane
2    cat   dog  mouse

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

# create a dataset
raw_data = {'score': [1,2,3], 
        'tags': [['apple','pear','guava'],['truck','car','plane'],['cat','dog','mouse']]}
df = pd.DataFrame(raw_data, columns = ['score', 'tags'])

# view the dataset
#print (df)

#3000 rows
df = pd.concat([df] * 1000, ignore_index=True)


In [110]: %timeit df.apply(lambda x: pd.Series(x['tags']),axis=1)
792 ms ± 27.1 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

In [111]: %timeit df['tags'].apply(pd.Series)
681 ms ± 16.6 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

In [112]: %timeit pd.DataFrame(df['tags'].values.tolist())
715 µs ± 8.91 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...