在熊猫中合并奇数和偶数索引行

时间:2019-02-02 23:05:13

标签: python python-3.x pandas dataframe pandas-groupby

我有一个这样的数据帧df

   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的偶数索引中。除此之外,我不确定我的方法是否正确。如果有人可以提供建议/帮助,我将不胜感激。

3 个答案:

答案 0 :(得分:2)

如果您对“ Net”中的浮点数没问题,则可以使用groupbyagg

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 

答案 1 :(得分:1)

一种解决方案是先使用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

答案 2 :(得分:0)

获取偶数行:df[df.index.map(lambda x: x%2==0)]

获取奇数行:df[df.index.map(lambda x: x%2==1)]