根据另一列中满足的条件更新列

时间:2021-03-18 07:33:30

标签: python pandas for-loop if-statement

我正在尝试在我的数据框中创建一个新列。这是我想要做的:

  • 创建一个新的“明星力量”列
    • 如果玩家点击量排在前 5 位,则“明星力量”增加 1 分,如果排在第 3 位,则增加 2 分,如果玩家排名第 1,则增加 3 分。

以下是创建我正在使用的数据框的较小版本的代码:

import pandas as pd

mydict = {
'Name' : ['Bill', 'Tom', 'Jack', 'Bob', 'Phil', 'Tim', 'Vick', 'Peter', 'Al', 'Jay'],
'Hits' : [20, 15, 22, 12, 5, 6, 12, 23, 13, 25],
'AVG' : [.750, .500, .250, .300, .200, .760, .450, .400, .330, .500],
'StarPower' : [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],}


df = pd.DataFrame(mydict)

df
<块引用>
    Name    Hits AVG    StarPower
0   Bill    20  0.75    0
1    Tom    15  0.50    0
2   Jack    22  0.25    0
3    Bob    12  0.30    0
4   Phil     5  0.20    0
5    Tim     6  0.76    0
6   Vick    12  0.45    0
7  Peter    23  0.40    0
8     Al    13  0.33    0
9    Jay    25  0.50    0

我知道我应该结合使用 for 循环和 if 语句。但老实说,我无法理解它。

感谢任何帮助。

2 个答案:

答案 0 :(得分:0)

首先对值进行排序,然后通过在 numpy.select 中的位置比较它们来设置值:

#if no duplicates
s = df['Hits'].sort_values(ascending=False)
#if possible duplicates
#s = df['Hits'].drop_duplicates().sort_values(ascending=False)

m1 = df['Hits'].eq(s.iloc[0])
m2 = df['Hits'].eq(s.iloc[1:3])
m3 = df['Hits'].eq(s.iloc[4:6])
df['StarPower'] = np.select([m1, m2, m3], [3,2,1])
print (df)
    Name  Hits   AVG  StarPower
0   Bill    20  0.75          0
1    Tom    15  0.50          1
2   Jack    22  0.25          2
3    Bob    12  0.30          0
4   Phil     5  0.20          0
5    Tim     6  0.76          0
6   Vick    12  0.45          0
7  Peter    23  0.40          2
8     Al    13  0.33          1
9    Jay    25  0.50          3

如果需要求和值:

#if no duplicates
s = df['Hits'].sort_values(ascending=False)
#if possible duplicates
#s = df['Hits'].drop_duplicates().sort_values(ascending=False)

m1 = df['Hits'].eq(s.iloc[0])
m2 = df['Hits'].eq(s.iloc[:3])
m3 = df['Hits'].eq(s.iloc[:6])
df['StarPower'] = m1 * 3 + m2 * 2 + m3 * 1
print (df)
    Name  Hits   AVG  StarPower
0   Bill    20  0.75          1
1    Tom    15  0.50          1
2   Jack    22  0.25          3
3    Bob    12  0.30          0
4   Phil     5  0.20          0
5    Tim     6  0.76          0
6   Vick    12  0.45          0
7  Peter    23  0.40          3
8     Al    13  0.33          1
9    Jay    25  0.50          6

答案 1 :(得分:0)

您可以将 pd.Series.rankdf.apply 一起使用,也可以使用 np.wherenp.select

df['Rank'] = df['Hits'].rank(method='dense').astype(int)

def fun(x):
    res = 0
    if x['Rank'] == 1:
        res =  3
    elif x['Rank'] <= 3 and x['Rank'] > 1:
        res = 2
    else:
        res = 1
    return res + x['StarPower']

df['StarPower'] = df.apply(fun, axis=1)
print(df)

输出:

    Name  Hits   AVG  StarPower  Rank
0   Bill    20  0.75          1     6
1    Tom    15  0.50          1     5
2   Jack    22  0.25          1     7
3    Bob    12  0.30          2     3
4   Phil     5  0.20          3     1
5    Tim     6  0.76          2     2
6   Vick    12  0.45          2     3
7  Peter    23  0.40          1     8
8     Al    13  0.33          1     4
9    Jay    25  0.50          1     9