Python 合并熊猫中的奇数和偶数索引行
我有一个像这样的数据帧Python 合并熊猫中的奇数和偶数索引行,python,python-3.x,pandas,dataframe,pandas-groupby,Python,Python 3.x,Pandas,Dataframe,Pandas Groupby,我有一个像这样的数据帧 Name Net Quantity 0 Auto 1010 10 1 NaN NaN 12 2 Rtal 4145 18 3 NaN NaN 14 4 Indl 6223 16 5 NaN 7222 18 Name Net Quantity 0 A
Name Net Quantity
0 Auto 1010 10
1 NaN NaN 12
2 Rtal 4145 18
3 NaN NaN 14
4 Indl 6223 16
5 NaN 7222 18
Name Net Quantity
0 Auto 1010 10,12
1 Rtal 4145 18,14
2 Indl 6223,7222 16,18
我的输出数据框应该是这样的
Name Net Quantity
0 Auto 1010 10
1 NaN NaN 12
2 Rtal 4145 18
3 NaN NaN 14
4 Indl 6223 16
5 NaN 7222 18
Name Net Quantity
0 Auto 1010 10,12
1 Rtal 4145 18,14
2 Indl 6223,7222 16,18
从上面的数据框中可以看到,如果奇数(索引)中存在任何值,我希望将这些值与偶数(索引)行组合,以便获得输出
我尝试了以下方法来提取奇数值
df.iloc[1::2, :]
这给了我以下几点,
Name Net Quantity
1 NaN NaN 12
3 NaN NaN 14
5 NaN 7222.0 18
在此之后,我现在不知道如何将这些值添加到我的
df
的偶数索引中。除此之外,我不确定我的方法是否正确。如果有人能提供建议/帮助,我将不胜感激。如果您对“网络”中的浮动没问题,您可以使用groupby
和agg
:
df.groupby(df.index // 2).agg(lambda x: x.dropna().astype(str).str.cat(sep=','))
Name Net Quantity
0 Auto 1010.0 10,12
1 Rtal 4145.0 18,14
2 Indl 6223.0,7222.0 16,18
为了处理浮标,溶液变得稍微复杂一些;如果可能,您可以使用
ffill
并尝试向下广播
df.groupby(df.index // 2).agg(
lambda x: ','.join(x.ffill(downcast='infer').astype(str).unique()))
Name Net Quantity
0 Auto 1010 10,12
1 Rtal 4145 18,14
2 Indl 6223,7222 16,18
一种解决方案是使用自定义函数
ffill
,然后使用groupby
。注意:该解决方案并不明确依赖于数据帧索引,因此也适用于更一般的情况,即可以从前一行推断出任意NaN
值
# forward fill to remove null values
df = df.ffill(downcast='infer')
# convert to str so you can use str.join later
grp_cols = ['Net', 'Quantity']
df[grp_cols] = df[grp_cols].astype(str)
# apply groupby with custom functions
res = df.groupby('Name').agg({'Net': lambda x: ','.join(np.unique(x)),
'Quantity': lambda x: ','.join(x)}).reset_index()
print(res)
# Name Net Quantity
# 0 Auto 1010 10,12
# 1 Indl 6223,7222 16,18
# 2 Rtal 4145 18,14
要获取偶数行,请执行以下操作:df[df.index.map(lambda x:x%2==0)] 获取奇数行的步骤:df[df.index.map(lambda x:x%2==1)]