我正在尝试清理一些有趣格式的数据。基本上,数据框看起来像这样:
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的第一篇文章,如果我不清楚或不遵守写作标准,特别是如果标题不明确,我道歉。我将非常感谢任何评论,以帮助我改进。
答案 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