根据一个值的出现对数据帧进行分组

时间:2017-05-30 12:11:14

标签: python pandas

我正在尝试清理一些有趣格式的数据。基本上,数据框看起来像这样:

 1     2     3
NaN | a   | b   |
    |foo  | bar |
    |foo2 | bar2|
NaN | c   | d   |
    |foo3 | bar3|

每次我在第1列中都有NaN时,我想在列a和b中加入我的组合,直到我遇到另一个NaN。最后,我想摆脱包含NaN的那一行。

结果数据框如下所示:

 1     2     3
a_b |foo  | bar |
a_b |foo2 | bar2|
c_d |foo3 | bar3|

我设法通过解析字符串来获得我想要的东西,但代码很大,我相信使用pandas可以更快地完成它。

这是我关于SO的第一篇文章,如果我不清楚或不遵守写作标准,特别是如果标题不明确,我道歉。我将非常感谢任何评论,以帮助我改进。

2 个答案:

答案 0 :(得分:0)

如果那些NaN确实是空值,你可以尝试这样的事情:

df['key']=df['1'].isnull().cumsum()

df_header = df[df['1'].isnull()]

df_out = df_header.merge(df[df['1'].notnull()], on='key',suffixes=('_x','')).set_index(['2_x','3_x'])

df_out.index = df_out.index.map('_'.join)

df_out.drop(['1_x','key','1'],axis=1).rename_axis(['1']).reset_index()

输出:

    1       2      3
0   a_b     foo     bar 
1   a_b     foo2    bar2
2   c_d     foo3    bar3

答案 1 :(得分:0)

您可以使用fillna功能执行此操作。

import pandas as pd
import numpy as np

#df test
l = ["foo",
"foo2",
"foo3",
"foo4" ]
df = pd.DataFrame(l)
df[1] = [np.nan for i in range(3)]+[1]
df[2] = ["bar"+str(i)for i in range(4)]

#Filling the nan with the additionned value of the two colums
df[1] = df[1].fillna(df[2]+df[0])

输入

    0       1   2
0   foo     NaN bar0
1   foo2    NaN bar1
2   foo3    NaN bar2
3   foo4    1.0 bar3

输出

    0       1           2
0   foo     bar0foo     bar0
1   foo2    bar1foo2    bar1
2   foo3    bar2foo3    bar2
3   foo4    1.0         bar3