我有一个看起来像这样的CSV文件:
ID, years_active, issues
-------------------------------
'Truck1', 8, 'In dire need of a paintjob'
'Car 5', 3, 'To small for large groups'
但是,CSV有些格式不正确,目前看起来像这样。
ID, years_active, issues
------------------------
'Truck1', 8, 'In dire need'
'','', 'of a'
'','', 'paintjob'
'Car 5', 3, 'To small for'
'', '', 'large groups'
现在,我能够通过缺少“ID”和“years_active”值来识别错误的行,并希望将“该行的问题”的值附加到具有“ID”和“前一行”的前一行years_active'值。
我对大熊猫不太熟悉,但想出了以下代码:
for index, row in df.iterrows():
if row['years_active'] == None:
df.loc[index-1]['issues'] += row['issues']
然而 - IF条件无法触发。 我想做的事情可能吗?如果是这样,有没有人知道我做错了什么?
答案 0 :(得分:3)
鉴于您的样本输入:
df = pd.DataFrame({
'ID': ['Truck1', '', '', 'Car 5', ''],
'years_active': [8, '', '', 3, ''],
'issues': ['In dire need', 'of a', 'paintjob', 'To small for', 'large groups']
})
您可以使用:
new_df = df.groupby(df.ID.replace('', method='ffill')).agg({'years_active': 'first', 'issues': ' '.join})
哪位能给你:
years_active issues
ID
Car 5 3 To small for large groups
Truck1 8 In dire need of a paintjob
所以我们在这里做的是将非空白ID转发到后续空白ID中,并使用这些ID对相关行进行分组。然后,我们汇总以首次出现 years_active ,并按照它们出现的顺序将 issue 列连接在一起,以创建单个结果。
答案 1 :(得分:2)
以下使用for
循环来查找和添加字符串(来自JonClements' answer的数据框):
df = pd.DataFrame({
'ID': ['Truck1', '', '', 'Car 5', ''],
'years_active': [8, '', '', 3, ''],
'issues': ['In dire need', 'of a', 'paintjob', 'To small for', 'large groups']
})
ss = ""; ii = 0; ilist = [0]
for i in range(len(df.index)):
if i>0 and df.ID[i] != "":
df.issues[ii] = ss
ss = df.issues[i]
ii = i
ilist.append(ii)
else:
ss += ' '+df.issues[i]
df.issues[ii] = ss
df = df.iloc[ilist]
print(df)
输出:
ID issues years_active
0 Truck1 In dire need of a paintjob 8
3 Car 5 To small for large groups 3
答案 2 :(得分:1)
在这个问题的上下文中可能值得一提的是,使用StringIO库经常会忽略一种处理尴尬输入的方法。
关键点是read_csv
可以从StringIO'文件中读取。
在这种情况下,我安排丢弃会混淆read_csv
的单引号和多个逗号,并将第二行和后续行的输入追加到第一行,以形成完整的,传统的csv行格式{{ 1}}。
以下是read_csv
收到的内容。
read_csv
代码很难看但很容易理解。
ID years_active issues
0 Truck1 8 In dire need of a paintjob
1 Car 5 3 To small for large groups