2017-05-04 6 views
1

これはデータフレーム以下です。実際のデータは膨大でNaNがたくさんあります。セルから有効な値を取得し、Pythonでpandasを使用して列を更新する

 Date  ID  Code Value Value1 Value2  Value3 
0 1945-12-30 H0010603 ZZZ008-2 zzz=ID AAC=10 NaN  NaN 
1 1945-12-30 H0010603 ZZZ008-2 zzz=ID AAC=01 NaN  NaN 
2 1945-12-30 H0010603 ZZZ008-2 NaN  NaN VEC=1  NaN 
3 1945-12-30 H0010603 ZZZ008-2 NaN  NaN VEC=2 AAC= 1 A 
4 1945-12-30 H0010603 ZZZ008-2 NaN  NaN VEC=3 AAC= 1 A 

これは最終的に予想されるデータです。

 Date  ID  Code zzz  AAC VEC  AAC.1 
0 1945-12-30 H0010603 ZZZ008-2  ID  10 NaN  NaN 
1 1945-12-30 H0010603 ZZZ008-2  ID  01 NaN  NaN 
2 1945-12-30 H0010603 ZZZ008-2 NaN  NaN  1  NaN 
3 1945-12-30 H0010603 ZZZ008-2 NaN  NaN  2  1 A 
4 1945-12-30 H0010603 ZZZ008-2 NaN  NaN  3  1 A 

実際に列名をセルの値で更新する必要があります。

df = pd.read_excel(xlPath, 0) 
writer = pd.ExcelWriter(xlPath, 
         engine='xlsxwriter', 
         date_format='mm/dd/yyy', 
         datetime_format='mm/dd/yyyy') 
df = df.fillna('') 
for ColumnName, values in df.iteritems(): 
    for index, value in enumerate(values): 
     if '=' in str(value): 
      df.set_value(index, ColumnName, str(value).split('=')[1]) 
      NewColumnName = str(value).split('=')[0] 
      df.rename(columns={ColumnName: NewColumnName}, inplace=True) 

df.to_excel(writer, index=False) 
writer.save() 

しかし、1つの列が繰り返されているため、これがエラーになります。 だから、私はdfをループして、与えられた列の最初の有効な値を取得してリストに入れることができると思った。

AllColumns = list(df.columns.values) 
NewColNameList = [] 
for ColumnName, values in df.iteritems(): 
    a = 0 
    for index, value in enumerate(values): 
     while a < len(values): 
      if '=' in str(value): 
       if value != '': 
        print(index, values) 
        NewColNameList.append(value) 
        break 
       a += 1 
print(NewColNameList) 

しかし、私は私が思ったようにWhileループでは強くありません。必要なdfを得るための助けに感謝します。

答えて

1

IIUC:

データセット:

In [314]: df 
Out[314]: 
     Date  ID  Code Value Value1 Value2 Value3 
0 1945-12-30 H0010603 ZZZ008-2 zzz=ID AAC=10 NaN  NaN 
1 1945-12-30 H0010603 ZZZ008-2 zzz=ID AAC=01 NaN  NaN 
2 1945-12-30 H0010603 ZZZ008-2  NaN  NaN VEC=1  NaN 
3 1945-12-30 H0010603 ZZZ008-2  NaN  NaN VEC=2 AAC= 1 A 
4 1945-12-30 H0010603 ZZZ008-2  NaN  NaN VEC=3 AAC= 1 A 

ソリューション:

def get_col_name(col): 
    if col.dtype != object: 
     return col.name 
    s = col.loc[col.str.contains(r'\w+\=').idxmax()] 
    if s and '=' in s: 
     return s.split('=')[0] 
    return col.name 

df = (df.rename(columns=lambda x: get_col_name(df[x]) if x.startswith('Value') else x) 
     .replace(r'\w+\=', '', regex=True)) 

結果:

In [83]: %paste 
df = (df.rename(columns=lambda x: get_col_name(df[x]) if x.startswith('Value') else x) 
     .replace(r'\w+\=', '', regex=True)) 
## -- End pasted text -- 

In [84]: df 
Out[84]: 
     Date  ID  Code zzz AAC VEC AAC 
0 1945-12-30 H0010603 ZZZ008-2 ID 10 NaN NaN 
1 1945-12-30 H0010603 ZZZ008-2 ID 01 NaN NaN 
2 1945-12-30 H0010603 ZZZ008-2 NaN NaN 1 NaN 
3 1945-12-30 H0010603 ZZZ008-2 NaN NaN 2 1 A 
4 1945-12-30 H0010603 ZZZ008-2 NaN NaN 3 1 A 
+0

これは、問題の半分のみを解決します。私はまた、残りのセルから削除する必要があるテキストから列名を追加する必要があります..それを行う方法はありますか? – Naveen

+0

@Naveen、更新された投稿を確認してください – MaxU

関連する問題