2016-07-22 10 views
1

새 df 'new_df'를 만들고자하는 다음 데이터 프레임 'df'가 있습니다. 나는 새로운 df를 얻는 데 어려움을 겪고있다.Python Pandas : 두 개의 열을 기반으로 dataFrame에 새 행을 만듭니다.

Cust-id Sex Country Orders   Products 
0 'Cu1' 'F' 'FR' 'ord1 + ord2'  'A+G' 
1 'Cu2' 'M' 'US' 'ord3'   'C' 
2 'Cu3' 'M' 'UK' 'ord4 + ord5'  'H+Z' 
3 'Cu4' 'F' 'RU' 'ord6'   'K' 
4 'Cu5' 'M' 'US' 'ord7'   'T' 
5 NaN  'M' 'UK' 'ord#'   'K' 
6 'Cu6' 'F' 'US' 'ord8+ord9+ord10' 'R+D+S' 
7 'Cu7' 'M' 'UK' 'ord11'   'A' 

'new_df'에 해당 '제품'이 포함 된 '주문'에 대한 행을 포함하고 싶습니다. 다른 모든 열은 내용을 유지합니다. 또한 'Cust-id'열의 행이 NaN 인 경우 완료 행이 삭제되어야합니다 (즉, 새 df에는 없음). 그러면 다음과 같은 new_df가 제공됩니다.

Cust-id Sex Country Orders Products 
0 'Cu1' 'F' 'FR' 'ord1'  'A' 
1 'Cu1' 'F' 'FR' 'ord2'  'G' 
2 'Cu2' 'M' 'US' 'ord3'  'C' 
3 'Cu3' 'M' 'UK' 'ord4'  'H' 
4 'Cu3' 'M' 'UK' 'ord5'  'Z' 
5 'Cu4' 'F' 'RU' 'ord6'  'K' 
6 'Cu5' 'M' 'US' 'ord7'  'T' 
7 'Cu6' 'F' 'US' 'ord8'  'R' 
8 'Cu6' 'F' 'US' 'ord9'  'D' 
9 'Cu6' 'F' 'US' 'ord10' 'S' 
10 'Cu7' 'M' 'UK' 'ord11' 'A' 

도움이되었거나 도움이 되었습니까?

답변

0

당신은 사용할 수 있습니다 : 코멘트에 의해

#remove ', split by +, create Series 
s1 = df.Products.str.strip("'") 
       .str.split('+', expand=True) 
       .stack() 
       .reset_index(drop=True, level=1) 

#remove ', split by +, create Series, strip spaces      
s2 = df.Orders.str.strip("'") 
       .str.split('+', expand=True) 
       .stack().str.strip() 
       .reset_index(drop=True, level=1) 

#if need add ' 
s1 = "'" + s1 + "'" 
s2 = "'" + s2 + "'" 
df1 = pd.DataFrame({'Products':s1, 'Orders':s2}, index=s1.index) 
print (df1) 
    Orders Products 
0 'ord1'  'A' 
0 'ord2'  'G' 
1 'ord3'  'C' 
2 'ord4'  'H' 
2 'ord5'  'Z' 
3 'ord6'  'K' 
4 'ord7'  'T' 
5 'ord#'  'K' 
6 'ord8'  'R' 
6 'ord9'  'D' 
6 'ord10'  'S' 
7 'ord11'  'A' 
#delete old columns, join df1, drop df if NaN in Cust-id 
print(df.drop(['Orders', 'Products'], axis=1) 
     .join(df1) 
     .dropna(subset=['Cust-id']) 
     .reset_index(drop=True)) 

    Cust-id Sex Country Orders Products 
0 'Cu1' 'F' 'FR' 'ord1'  'A' 
1 'Cu1' 'F' 'FR' 'ord2'  'G' 
2 'Cu2' 'M' 'US' 'ord3'  'C' 
3 'Cu3' 'M' 'UK' 'ord4'  'H' 
4 'Cu3' 'M' 'UK' 'ord5'  'Z' 
5 'Cu4' 'F' 'RU' 'ord6'  'K' 
6 'Cu5' 'M' 'US' 'ord7'  'T' 
7 'Cu6' 'F' 'US' 'ord8'  'R' 
8 'Cu6' 'F' 'US' 'ord9'  'D' 
9 'Cu6' 'F' 'US' 'ord10'  'S' 
10 'Cu7' 'M' 'UK' 'ord11'  'A'  

편집 :

사용 concatdf1을 만드는 :

... 
... 
df1 = pd.concat([s1, s2], keys=('Orders', 'Products'), axis=1) 
print (df1) 
    Orders Products 
0 'A' 'ord1' 
0 'G' 'ord2' 
1 'C' 'ord3' 
2 'H' 'ord4' 
2 'Z' 'ord5' 
3 'K' 'ord6' 
4 'T' 'ord7' 
5 'K' 'ord#' 
6 'R' 'ord8' 
6 'D' 'ord9' 
6 'S' 'ord10' 
7 'A' 'ord11' 

print(df.drop(['Orders', 'Products'], axis=1) 
     .join(df1) 
     .dropna(subset=['Cust-id']) 
     .reset_index(drop=True)) 

    Cust-id Sex Country Orders Products 
0 'Cu1' 'F' 'FR' 'A' 'ord1' 
1 'Cu1' 'F' 'FR' 'G' 'ord2' 
2 'Cu2' 'M' 'US' 'C' 'ord3' 
3 'Cu3' 'M' 'UK' 'H' 'ord4' 
4 'Cu3' 'M' 'UK' 'Z' 'ord5' 
5 'Cu4' 'F' 'RU' 'K' 'ord6' 
6 'Cu5' 'M' 'US' 'T' 'ord7' 
7 'Cu6' 'F' 'US' 'R' 'ord8' 
8 'Cu6' 'F' 'US' 'D' 'ord9' 
9 'Cu6' 'F' 'US' 'S' 'ord10' 
10 'Cu7' 'M' 'UK' 'A' 'ord11' 
+0

감사를보십시오. df1을 만들 때 ValueError가 발생합니다 ("중복 축에서 다시 색인 할 수 없음"). 이 문제를 어떻게 해결할 수 있습니까? –

+0

그런 다음'df = pd.concat ([s1, s2], keys = ('Orders', 'Products'), axis = 1)'시도해보십시오. – jezrael

+0

감사합니다.하지만 초기 코드가 제대로 작동하지 않는 것 같습니다. 데이터에 오류가있었습니다. –

-1

다음 코드를 사용하여 CSV로 DF 쓰기 오류 0을 수정합니다.

 df.dropna().to_csv('train1.csv') 
많이 감사 헬프 jezrael,이

관련 문제