【发布时间】:2014-09-19 03:39:05
【问题描述】:
我有一个数据框 (df)(最初来自一个 excel 文件),前 9 行是这样的:
Control Recd_Date/Due_Date Action Signature/Requester
0 2000-1703 2000-01-31 00:00:00 OC/OER/OPA/PMS/ M WEBB
1 NaN 2000-02-29 00:00:00 NaN DATA CORP
2 2000-1776 2000-01-02 00:00:00 OC/ORA/OE/DCP/ G KAN
3 NaN 2000-01-03 00:00:00 OC/ORA/ORO/PNC/ PALM POST
4 NaN NaN FDA/OGROP/ORA/SE-FO/FLA- NaN
5 NaN NaN DO/FLA-CB/ NaN
6 2000-1983 2000-02-02 00:00:00 FDA/OGROP/ORA/CE-FO/CHI- M EGAN
7 NaN 2000-02-03 00:00:00 DO/CHI-CB/ BERNSTEIN LIEBHARD &
8 NaN NaN NaN LONDON LLP
- Type(df['Control'][1])=float;
- Type(df['Recd_Date/Due_Date'][1])=datetime.datetime;
- type(df['Action_Office'][1])=float;
- Type(df['Signature/Requester'][1])=unicode
我想将此数据框(例如前 9 行)转换为:
Control Recd_Date/Due_Date Action Signature/Requester
0 2000-1703 2000-01-31 00:00:00,2000-02-29 00:00:00 OC/OER/OPA/PMS/ M WEBB,DATA CORP
1 2000-1776 2000-01-02 00:00:00,2000-01-03 00:00:00 OC/ORA/OE/DCP/OC/ORA/ORO/PNC/FDA/OGROP/ORA/SE-FO/FLA-DO/FLA-CB/ G KAN,PALM POST
2 2000-1983 2000-02-02 00:00:00,2000-02-03 00:00:00 FDA/OGROP/ORA/CE-FO/CHI-DO/CHI-CB/ M EGAN,BERNSTEIN LIEBHARD & LONDON LLP
所以基本上:
- 每次 pd.isnull(row['Control'])(这应该是唯一的 if 条件)为真时,然后将此行与前一行(其 'control' 值不为空)合并。
- 对于“Recd_Date/Due_Date”和“Signature/Requester”,在每两个值(来自两个合并的行)之间添加“,”(或“/”)(例如“2000-01-31 00:00:00” ,2000-02-29 00:00:00' 和 'G KAN,PALM POST')
- 对于“操作”,只需合并它们而不添加任何标点符号(例如 FDA/OGROP/ORA/CE-FO/CHI-DO/CHI-CB/)
有人可以帮我吗?这是我试图让它工作的代码:
for i, row in df.iterrows():
if pd.isnull(df.ix[i]['Control_#']):
df.ix[i-1]['Recd_Date/Due_Date'] = str(df.ix[i-1]['Recd_Date/Due_Date'])+'/'+str(df.ix[i]['Recd_Date/Due_Date'])
df.ix[i-1]['Subject'] = str(df.ix[i-1]['Subject'])+' '+str(df.ix[i]['Subject'])
if str(df.ix[i-1]['Action_Office'])[-1] == '-':
df.ix[i-1]['Action_Office'] = str(df.ix[i-1]['Action_Office'])+str(df.ix[i]['Action_Office'])
else:
df.ix[i-1]['Action_Office'] = str(df.ix[i-1]['Action_Office'])+','+str(df.ix[i]['Action_Office'])
if pd.isnull(df.ix[i-1]['Signature/Requester']):
df.ix[i-1]['Signature/Requester'] = str(df.ix[i-1]['Signature/Requester'])+str(df.ix[i]['Signature/Requester'])
elif str(df.ix[i-1]['Signature/Requester'])[-1] == '&':
df.ix[i-1]['Signature/Requester'] = str(df.ix[i-1]['Signature/Requester'])+' '+str(df.ix[i]['Signature/Requester'])
else:
df.ix[i-1]['Signature/Requester'] = str(df.ix[i-1]['Signature/Requester'])+','+str(df.ix[i]['Signature/Requester'])
df.drop(df.index[i])
为什么 drop() 不起作用?我正在尝试删除当前行(如果其 ['Control_#'] 为空),因此可以将下一行(其 ['Control_#'] 为空)添加到上一行(其 ['Control_#'] 为NOT null) 迭代..
非常感谢!!
【问题讨论】:
-
你看过移位方法吗? stackoverflow.com/questions/22081878/…
-
谢谢你!我已经编辑了我的问题,有人可以帮我解决这个问题吗?
标签: python pandas data-cleaning