2017-01-19 1 views
1

Я хотел бы дублировать строку кадра данных так же, как и элементы, которые у меня есть в первом столбце.Python, dataframes: дублирующие элементы в столбце списков и приписывание им строк в другом столбце

У меня есть следующий dataframe:

 columns_A   columns_B 
0 [1,2,3,4]   ['bob', 'mary'] 
1 [7,9]    ['banana', 'apple'] 

И я хочу в итоге:

 columns_A   columns_B 
0 1     ['bob', 'mary'] 
1 2     ['bob', 'mary'] 
2 3     ['bob', 'mary'] 
3 4     ['bob', 'mary'] 
4 7     ['banana', 'apple'] 
5 9     ['banana', 'apple'] 

На данный момент я могу получить доступ список column_A, но я не могу присвоить каждому элементу соответствующий список в столбце_B. Следующий код передайте мне первую строку column_B ко всем элементам. Я не знаю, как атрибут строки в соответствии с расположением строки1 в столбце_А.

for line1 in df.column_A: 
    for i in line1: 
     s= {i : df.column_B[0]} 
     print s 

Спасибо за вашу помощь

ответ

3

Я думаю, что вы можете использовать numpy.repeat для повторных значений по legths по str.len и плоских значений вложенной lists по chain:

from itertools import chain 

df2 = pd.DataFrame({ 
     "columns_B": np.repeat(df.columns_B.values, df.columns_A.str.len()), 
     "columns_A": list(chain.from_iterable(df.columns_A))}) 

print (df2) 
    columns_A  columns_B 
0   1  [bob, mary] 
1   2  [bob, mary] 
2   3  [bob, mary] 
3   4  [bob, mary] 
4   7 [banana, apple] 
5   9 [banana, apple] 

Чистое решение панды является joinSeries созданный DataFrame конструктор и stack:

df2 = pd.DataFrame(df.columns_A.values.tolist()) 
     .stack() 
     .reset_index(level=1, drop=True) 
     .astype(int) 
     .rename('columns_A') 
print (df2) 
0 1 
0 2 
0 3 
0 4 
1 7 
1 9 
Name: columns_A, dtype: int32 

print (df.drop('columns_A', axis=1).join(df2).reset_index(drop=True)) 
     columns_B columns_A 
0  [bob, mary]   1 
1  [bob, mary]   2 
2  [bob, mary]   3 
3  [bob, mary]   4 
4 [banana, apple]   7 
5 [banana, apple]   9 
+0

@piRSquared - спасибо. – jezrael

3

использованием pd.melt

a, b = df 
pd.melt(
    df.drop(a, 1).join(df[a].apply(pd.Series)), 
    b, [0, 1, 2, 3], value_name=a 
).dropna()[df.columns.tolist()].astype(df.dtypes) \ 
.sort_values(b, ascending=False).reset_index(drop=True) 

    columns_A  columns_B 
0   1  [bob, mary] 
1   2  [bob, mary] 
2   3  [bob, mary] 
3   4  [bob, mary] 
4   7 [banana, apple] 
5   9 [banana, apple] 
+0

Красивый материал. Если я просто последую за вами, я стану экспертом в Pandas =) – Moondra

Смежные вопросы