2016-10-26 6 views
2

У меня есть dataframe (Df), содержащих несколько колонок и два из них хранить список в каждой строке:Plotting столбец, содержащий списки с помощью панд

Index list1        list2 
A [ 0.09173306 0.12331911 0.20057651 ] [ 0.3128322 0.27153913 ] 
D [ 0.03861522 0.10524985 ]    [ 0.37265687 0.48347806 ] 
E [ 0.02124905 0.01149118 ]    [ 0.04348405 0.17057435 0.37838683 0.37481453 ] 

Я хотел бы построить эти списки в виде гистограммы с использованием pandas встроенный plot функция.

Использование

df.list1.apply(lambda x:x[0]).plot(kind='bar', width=0.9, ax=bar_ax) 

Я могу построить первый элемент каждого списка. Однако, пытаясь

df.list1.plot(kind='bar', width=0.9, ax=bar_ax) 

результаты в следующей ошибки:

Empty 'DataFrame': no numeric data to plot 

То, что я хотел бы сделать это, (1) сюжет как список в один единый сюжет, как так:

df[['list1','list2']].plot(kind='bar', width=0.9, ax=bar_ax) 

И (2) также отображает первые элементы каждого списка только в одном отдельном столбце, который я могу сделать следующим образом:

df.list1.apply(lambda x:x[0]).plot(kind='bar', width=0.9, ax=bar_ax, color='blue') 
df.list2.apply(lambda x:x[0]).plot(kind='bar', width=0.9, ax=bar_ax, color='red') 

Однако, это приводит к бруски затевается друг на друга (не укладывается!) - Я хочу, чтобы они сгруппированы.

ответ

2

Рассмотрим этот DF, содержащие значения в виде списков, как показано:

np.random.seed(42) 
df = pd.DataFrame({'list1': np.random.randint(0, 10, (5,2)).tolist(), 
        'list2': np.random.randint(0, 10, (5,3)).tolist()}, 
        index=list('ABCDE')) 

Image

Q-1земля как список в один сюжет:

разборки стопки в DF, чтобы имена столбцов отображаются в виде индекса и сделать отдельные значения присутствуют в список для отдельных объектов серии.

df_lists = df[['list1','list2']].unstack().apply(pd.Series) 
df_lists.plot.bar(rot=0, cmap=plt.cm.jet, fontsize=8, width=0.7, figsize=(8,4)) 

Image

Q-2земля первые элементы каждого списка только в одном сгруппированных барной стойкой:

Используйте DF.applymap, чтобы выбрать первый элемент из требуемых столбцов для получения диаграммы сгруппированных штрихов.

df[['list1','list2']].applymap(lambda x: x[0]).plot.bar(rot=0, color=list('br')) 

Image

+1

Метод applymap - это то, что я искал. Спасибо! – Fourier

1

Пример:

df = pd.DataFrame({'list1':[[ 0.09173306, 0.12331911, 0.20057651], [ 0.03861522, 0.10524985],[ 0.02124905, 0.01149118 ]], 
        'list2':[[0.3128322, 0.27153913], [0.37265687, 0.48347806], [0.04348405, 0.17057435, 0.37838683, 0.37481453]]}, 
        index=['A','D','E']) 
print (df) 
            list1 \ 
A [0.09173306, 0.12331911, 0.20057651] 
D    [0.03861522, 0.10524985] 
E    [0.02124905, 0.01149118] 

               list2 
A       [0.3128322, 0.27153913] 
D       [0.37265687, 0.48347806] 
E [0.04348405, 0.17057435, 0.37838683, 0.37481453] 

Первое решение:

import matplotlib.pyplot as plt 

df.list1.apply(lambda x: pd.Series(x)).plot(kind='bar', width=0.9) 
plt.show() 

Второе решение со стеком:

Я думаю, Вам нужно первый перекроить данные от обращенного list к Series по DataFrame конструктор с stack

dfL1 = pd.DataFrame(df.list1.values.tolist(), index=df.index).stack() 
print (dfL1) 
A 0 0.091733 
    1 0.123319 
    2 0.200577 
D 0 0.038615 
    1 0.105250 
E 0 0.021249 
    1 0.011491 

dfL2 = pd.DataFrame(df.list2.values.tolist(), index=df.index).stack() 
print (dfL2) 
A 0 0.312832 
    1 0.271539 
D 0 0.372657 
    1 0.483478 
E 0 0.043484 
    1 0.170574 
    2 0.378387 
    3 0.374815 
dtype: float64 

Тогда concat их вместе:

df = pd.concat([dfL1, dfL2], axis=1, keys=('list1','list2')) 
print (df) 
     list1  list2 
A 0 0.091733 0.312832 
    1 0.123319 0.271539 
    2 0.200577  NaN 
D 0 0.038615 0.372657 
    1 0.105250 0.483478 
E 0 0.021249 0.043484 
    1 0.011491 0.170574 
    2  NaN 0.378387 
    3  NaN 0.374815 

И последний plot:

import matplotlib.pyplot as plt 

df[['list1','list2']].plot(kind='bar', width=0.9) 
plt.show() 
+0

Я также использовал ваш метод, основанный на CONCAT, который был очень полезным для построения дополнительных несколько списков – Fourier

+0

Да, только одно решение может быть принято;) – jezrael

+0

Свым делом предпочтения других пользователей я верить. Еще раз спасибо. – Fourier