Эти ответы основаны на формате кадра данных, всегда представляющего пары строк, которые следуют одному и тому же шаблону, представленному OP.Первая строка показывает человека, вторая строка показывает продукт и дату, столбцы цен: NaN.
Использование shift
, затем dropna
df.assign(Product=df.Particulars.shift(-1)).dropna()
Serial Date Particulars Price Product
0 1 308.0 Andrew 100.0 Gloves
2 3 408.0 Johnson 50.0 Wicket
join
Та же самая вещь, но другая
df.join(df.Particulars.shift(-1).rename('Product')).dropna()
Подробности
По запросу
df.Particulars.shift(-1)
объединяет всех членовСтолбец подробностей на одну строку назад
0 Gloves
1 Johnson
2 Wicket
3 NaN
Name: Particulars, dtype: object
Когда я присваиваю его существующему фрейму данных df.assign(Product=df.Particulars.shift(-1))
, он добавляет столбец с новым именем 'Product'
, значения которого представляют собой сдвинутые сведения.
Serial Date Particulars Price Product
0 1 308.0 Andrew 100.0 Gloves
1 2 NaN Gloves NaN Johnson
2 3 408.0 Johnson 50.0 Wicket
3 4 NaN Wicket NaN NaN
Осталось только отбросить строки со значениями NaN
, и мы получили то, что представлено выше.
Мне не нужно зависеть от dropna
, если я нарежу каждую вторую строку
df.assign(Product=df.Particulars.shift(-1))[::2]
Или даже более кратко
df[::2].assign(Product=[*df.Particulars[1::2]])
Один из способов сделать это
Это был первый способ, о котором я подумал, и это брутто
i = np.flatnonzero(df.Price.notna())
j = i + 1
df.iloc[i].assign(Product=df.iloc[j].Particulars.values)
Serial Date Particulars Price Product
0 1 308.0 Andrew 100.0 Gloves
2 3 408.0 Johnson 50.0 Wicket