Добавить строку в соответствии с существованием Панды - PullRequest
1 голос
/ 02 октября 2019

У меня есть набор данных, который содержит:

ID_POINT ID_PRODUCT QUANTITY
A        11          5
A        52          10
B        30          20
C        11          2

, и у меня есть общий идентификатор продукта

ID_PRODUCT
11
20
30
44
52

С этими двумя таблицами я хочу создать эту таблицу:

ID_POINT ID_PRODUCT QUANTITY
A        11          5
A        52          10
A        20          0
A        30          0
A        44          0
B        30          20
B        11          0
B        20          0
B        30          0
B        44          0
B        52          0
C        11          2
C        20          0
C        30          0
C        44          0
C        52          0

Таким образом, если первая точка идентификатора муравья набора данных не содержит какого-либо id_product, ее необходимо добавить в набор данных с количеством 0.

data = pd.read_csv('first.csv', delimiter=",")  # reading the file. 
products = pd.read_csv('products.csv', delimiter=",")  # reading the file. 

Ответы [ 4 ]

0 голосов
/ 02 октября 2019

Вы можете сделать это с помощью однострочного кода (при условии, что вы имели в виду объединение / слияние путем добавления)

products.set_index("ID_PRODUCT").join(data[data["QUANTITY"] != 0].set_index("ID_PRODUCT"), how = "left")
0 голосов
/ 02 октября 2019

то, что тебе нужно, мой друг, называется «внешнее соединение». что может быть достигнуто в пандах, вот так.

     new_merged_df = pd.merge(df1, df2, on='ID_PRODUCT', how='outer')
     new_merged_df.fillna(0,inplace = True)

надеюсь, что поможет

0 голосов
/ 02 октября 2019

вы можете объединить два кадра данных

output = pd.merge(products,data,how="left",on=["ID_PRODUCT"]).fillna(0)
0 голосов
/ 02 октября 2019

Если много групп и производительность важна лучше, то для каждой группы порядок ID_PRODUCT - используйте MultiIndex.from_product с DataFrame.reindex:

mux = pd.MultiIndex.from_product([df1['ID_POINT'].unique(), df2['ID_PRODUCT']],
                                  names=['ID_POINT','ID_PRODUCT'])
df = df1.set_index(['ID_POINT','ID_PRODUCT']).reindex(mux, fill_value=0).reset_index()
print (df)
   ID_POINT  ID_PRODUCT  QUANTITY
5         A          11         5
6         A          20         0
7         A          30         0
8         A          44         0
9         A          52        10
10        B          11         0
11        B          20         0
12        B          30        20
13        B          44         0
14        B          52         0
15        C          11         2
16        C          20         0
17        C          30         0
18        C          44         0
19        C          52         0

Или создайте DataFrame со всеми возможными комбинациями и используйте DataFrame.merge с левым соединением:

from  itertools import product

df3 = pd.DataFrame(product(df1['ID_POINT'].unique(),  df2['ID_PRODUCT']),
                   columns=['ID_POINT','ID_PRODUCT'])
df = df3.merge(df1, how='left').fillna({'QUANTITY': 0})
print (df)
   ID_POINT  ID_PRODUCT  QUANTITY
0         A          11       5.0
1         A          20       0.0
2         A          30       0.0
3         A          44       0.0
4         A          52      10.0
5         B          11       0.0
6         B          20       0.0
7         B          30      20.0
8         B          44       0.0
9         B          52       0.0
10        C          11       2.0
11        C          20       0.0
12        C          30       0.0
13        C          44       0.0
14        C          52       0.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...