熊猫根据单列值连接重复的行

时间:2021-06-15 11:58:20

标签: python python-3.x pandas dataframe

我正在尝试删除数据框中的重复值和空白,然后对所有值重新排序,以便在一行中,所有列值都以相同的数字结尾:

这是我当前的数据框:

const arr = [
  ["Calendar Name", "Standard"],
  ["Valid From", 44197],
  ["Valid To", 44561],
  ["Use Holidays", "yes"],
  [
    "Working Day",
    "Monday",
    "Tuesday",
    "Wednesday",
    "Thursday",
    "Friday",
    "Saturday",
    "Sunday",
  ],
  [
    "Start",
    0.3333333333333333,
    0.3333333333333333,
    0.3333333333333333,
    0.3333333333333333,
    0.3333333333333333,
    "-",
    "-",
  ],
  [
    "End",
    0.8333333333333334,
    0.8333333333333334,
    0.8333333333333334,
    0.8333333333333334,
    0.8333333333333334,
    "-",
    "-",
  ],
];

const [[first, second]] = arr;
console.log(first, second);

这就是我想要的输出:

    brand   code   des   price   year
0  brand1  code1  des1  price1  year1
1  brand2  code2        price2       
2  brand3  code3  des3  price3  year3
3  brand4  code4        price4       
4  brand5  code5  des5  price5  year5
5  brand6  code6        price6       
6          code2  des2          year2
7          code4  des4          year4
8          code6  des6          year6

这是我写的代码,如果有人能指导我怎么做,那将不胜感激:

    brand   code   des   price   year
0  brand1  code1  des1  price1  year1
1  brand2  code2  des2  price2  year2
2  brand3  code3  des3  price3  year3
3  brand4  code4  des4  price4  year4
4  brand5  code5  des5  price5  year5
5  brand6  code6  des6  price6  year6

2 个答案:

答案 0 :(得分:3)

您可以在每列上使用 df.apply(),然后对于每个列系列,使用 np.unique() 获取已排序的唯一项列表(跳过空字符串),然后使用 pd.Series 重新创建列。

import numpy as np

df.apply(lambda x: pd.Series(np.unique(x[x!=''])))

输出:

    code   des   price   year   brand
0  code1  des1  price1  year1  brand1
1  code2  des2  price2  year2  brand2
2  code3  des3  price3  year3  brand3
3  code4  des4  price4  year4  brand4
4  code5  des5  price5  year5  brand5
5  code6  des6  price6  year6  brand6

答案 1 :(得分:0)

这是您要找的吗?首先用 np.nan 填充空白区域,然后使用 apply

删除 na 行
df = df.replace(r'^\s*$', np.nan, regex=True)
df.apply(lambda x: pd.Series(x.dropna().values))

code    des     price   year    brand
0   code1   des1    price1  year1   brand1
1   code2   des3    price2  year3   brand2
2   code3   des5    price3  year5   brand3
3   code4   des2    price4  year2   brand4
4   code5   des4    price5  year4   brand5
5   code6   des6    price6  year6   brand6
6   code2   NaN     NaN     NaN     NaN
7   code4   NaN     NaN     NaN     NaN
8   code6   NaN     NaN     NaN     NaN