根据熊猫数据框中的多行添加列

时间:2019-06-18 02:56:31

标签: python pandas

如何基于对另一个数据框的多行中的值的操作来在数据框中添加一列?

这是我最初的数据帧示例。

DF

我想要输出如下

Output

其中

enter image description here

示例

enter image description here

直到现在,我尝试使用unique(ord_date,crt_code和del_date组合)添加一个新的数据框,然后尝试计算每行的得分,但是如果条件不明确,我将不知道如何放置。

df2['score'][(df2['ord_date']==xxxx)&(df2['crt_code']==xxxx)&(df2['del_date']==xxxx)] 

= if(df['val1'][(df['slb_qty']==2)&(df['ord_date']==xxxx)&(df['crt_code']==xxxx)&(df['del_date']==xxxx)] + df['val1'][(df['slb_qty']==12)&(df['ord_date']==xxxx)&(df['crt_code']==xxxx)&(df['del_date']==xxxx)] >=80 ) then 200

此外,这将成为检查所有4个条件的大型语句,这些条件将很难阅读。

如果可以的话,有人可以建议如何以更简洁/简单的方式实现我想要的输出吗?

1 个答案:

答案 0 :(得分:1)

  1. 您需要收集唯一的值
  2. 每个唯一值的总数量
  3. 计算他们的分数

下次将数据以文本形式发布,而不是以图像形式发布。

我的代码及其说明:

= ^ .. ^ =

import pandas as pd
from io import StringIO

data = StringIO("""
ord_date crt_code del_date slb_qty val1
01/01/2019 125 10/01/2019 2 38
01/01/2019 125 10/01/2019 4 27
01/01/2019 125 10/01/2019 12 35
01/01/2019 128 10/01/2019 2 45
01/01/2019 128 10/01/2019 4 21
01/01/2019 128 10/01/2019 12 23
01/01/2019 128 10/01/2019 14 24
02/01/2019 125 10/01/2019 2 37
02/01/2019 125 10/01/2019 12 30
02/01/2019 125 10/01/2019 4 29
02/01/2019 128 10/01/2019 14 22
02/01/2019 128 10/01/2019 4 26
02/01/2019 128 10/01/2019 12 21
02/01/2019 128 10/01/2019 2 29
""")

# load data
df = pd.read_csv(data, sep=" ")


# get unique values
df_unique = df.groupby(['ord_date', 'crt_code', 'del_date']).size().reset_index()
# drop last column
df_unique = df_unique.drop([0], axis=1)


# sum quantity values
slb_qty_2_12 = []
slb_qty_4_14 = []
for index, row in df_unique.iterrows():
    # select row range from raw data
    selected_rows = df[(df['ord_date'] == row['ord_date']) & (df['crt_code'] == row['crt_code']) & (df['del_date'] == row['del_date'])]
    # find 2 and 12 qty
    rows_2_12 = selected_rows[(selected_rows['slb_qty'] == 2) | (selected_rows['slb_qty'] == 12)]
    # sum values
    values_sum = rows_2_12['val1'].sum()
    # collect data
    slb_qty_2_12.append(values_sum)
    # find 4 and 14 qty
    rows_4_14 = selected_rows[(selected_rows['slb_qty'] == 4) | (selected_rows['slb_qty'] == 14)]
    # sum values
    values_sum = rows_4_14['val1'].sum()
    # collect data
    slb_qty_4_14.append(values_sum)


# add calculated values to data frame
df_unique['slb_qty_2_12'] = slb_qty_2_12
df_unique['slb_qty_4_14'] = slb_qty_4_14


# calculate score
score = []
for index, row in df_unique.iterrows():
    if row['slb_qty_4_14'] >= 80:
        score.append(300)
    elif 80 > row['slb_qty_4_14'] >= 60:
        score.append(150)
    elif row['slb_qty_2_12'] >= 80:
        score.append(200)
    elif 80 > row['slb_qty_2_12'] >= 60:
        score.append(100)
    else:
        score.append(0)


# drop used columns
df_unique = df_unique.drop(['slb_qty_2_12', 'slb_qty_4_14'], axis=1)
# add score
df_unique['Score'] = score

输出:

     ord_date  crt_code    del_date  Score
0  01/01/2019       125  10/01/2019    100
1  01/01/2019       128  10/01/2019    100
2  02/01/2019       125  10/01/2019    100
3  02/01/2019       128  10/01/2019      0