如果其他列为空,Pandas会连接某些列

时间:2017-12-30 11:53:45

标签: pandas

我有一个看起来像这样的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条件无法触发。 我想做的事情可能吗?如果是这样,有没有人知道我做错了什么?

3 个答案:

答案 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