2016-06-24 8 views
1

Я ищу способ преобразования столбцов dataframe в виде строк. Ниже мой пример dataframe:pandas dataframe конвертировать столбцы в виде строк

mylist= [['xx'], [None, 'yy'], ['xx', None], ['xx',None],['xx','yy']] 

pd.DataFrame(mylist,index=['A','B','C','D','E'],columns=['Col1','Col2']) 

Входной DataFrame:

------------------- 
Ind | Col1 | Col2 | 
------------------- 
A | xx | None | 
B | None | yy | 
C | xx | None | 
D | xx | None | 
E | xx | yy | 
------------------- 

Я хочу разделить мои столбцы в виде отдельных строк в dataframe. Ниже показано, как выглядит мой желаемый результат. Может ли кто-нибудь предложить, как добиться следующего.

Желаемая dataframe:

------------------------ 
Ind | Values | Columns | 
------------------------ 
A | xx  | Col1 | 
B | yy  | Col2 | 
C | xx  | Col1 | 
D | xx  | Col1 | 
E | xx  | Col1 | 
E | xx  | Col2 | 
------------------------ 

Спасибо,
Ртуть

ответ

3

Другой вариант заключается в использовании melt:

longDf = pd.melt(df.reset_index(), id_vars=['index'], var_name=['Columns']) 
longDf[pd.notnull(longDf.value)] 

    index Columns value 
0 A Col1 xx 
2 C Col1 xx 
3 D Col1 xx 
4 E Col1 xx 
6 B Col2 yy 
9 E Col2 yy 
+0

Это потрясающе! – bernie

+0

@bernie Спасибо. 'stack()' тоже отличный способ сделать это. – Psidom

2
df = pd.DataFrame(mylist,index=['A','B','C','D','E'],columns=['Col1','Col2']) 
# rotate df 
stacked_df = pd.DataFrame(df.stack().reset_index()) 
# name columns 
stacked_df.columns = ['Ind','Columns','Values'] 
# reorder columns 
reordered_df = pd.DataFrame(stacked_df,columns=['Ind','Values','Columns']) 

Результаты в:

>>> reordered_df 
    Ind Values Columns 
0 A  xx Col1 
1 B  yy Col2 
2 C  xx Col1 
3 D  xx Col1 
4 E  xx Col1 
5 E  yy Col2 
1

В случае двух значений, кажется, что вы хотите только первый (например, в последней строке вашего примера).

Вы можете использовать loc, чтобы сначала установить второе значение в None, если оба столбца имеют значения.

df.loc[(df.Col1.notnull()) & (df.Col2.notnull()), 'Col2'] = None 

0 Вы можете последовать вызову на результаты melt.

>>> pd.melt(df.reset_index(), id_vars='index', var_name='Columns', value_name='Values' 
      ).dropna().set_index('index')[['Values', 'Columns']] 

     Values Columns 
index    
A   xx Col1 
C   xx Col1 
D   xx Col1 
E   xx Col1 
B   yy Col2 
Смежные вопросы