Объедините нечетные и четные строки в пандах - PullRequest
0 голосов
/ 03 февраля 2019

У меня есть фрейм данных 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.Кроме того, я не уверен, что мой подход правильный.Буду признателен, если кто-нибудь сможет посоветовать / помочь.

Ответы [ 2 ]

0 голосов
/ 03 февраля 2019

Одним из решений является 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
0 голосов
/ 03 февраля 2019

Если у вас все в порядке с числами в сети, вы можете использовать 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 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...