Python 创建条件列问题

Python 创建条件列问题,python,pandas,Python,Pandas,我有一个样本数据集 import pandas as pd df = { 'columA':['1A','ws rank','rank','ws rank','rank','Drank'], 'value': [ 1, 12, 34, 50, 3,2] } df = pd.DataFrame(df) 1。我想为“ws-rank”和“rank”以及“waked”的columnA行创建一列“HP”,如果值为1,则HP为25;如果值为2,则HP为24……等等。 所以我首先创建了一个较小的

我有一个样本数据集

import pandas as pd

df = {
  'columA':['1A','ws rank','rank','ws rank','rank','Drank'],
 'value': [ 1, 12, 34, 50, 3,2]
}


df = pd.DataFrame(df)
1。我想为“ws-rank”和“rank”以及“waked”的columnA行创建一列“HP”,如果值为1,则HP为25;如果值为2,则HP为24……等等。
所以我首先创建了一个较小的数据集,只包含这些行,因为我的实际数据集非常大。然后,我将连接此数据集和原始数据集,以包含“HP”列。但是当我连接数据集时,会出现重复的行。所以一定有更简单的方法

我的代码:

dfrank=df[df["columA"].str.contains('ws rank|rank')]
dfrank['value'] = dfrank['value'].astype(int)
dfrank.loc[dfrank.value == 1, 'HP'] = 25
dfrank.loc[dfrank.value == 2, 'HP'] = 24
dfrank.loc[dfrank.value == 3, 'HP'] = 23
dfrank.loc[dfrank.value == 4, 'HP'] = 22
dfrank.loc[dfrank.value == 5, 'HP'] = 21
dfrank.loc[dfrank.value == 6, 'HP'] = 20
dfrank.loc[dfrank.value == 7, 'HP'] = 19
dfrank.loc[dfrank.value == 8, 'HP'] = 18
dfrank.loc[dfrank.value == 9, 'HP'] = 17
dfrank.loc[dfrank.value == 10, 'HP'] = 16
dfrank.loc[dfrank.value == 11, 'HP'] = 15
dfrank.loc[dfrank.value == 12, 'HP'] = 14
dfrank.loc[dfrank.value == 13, 'HP'] = 13
dfrank.loc[dfrank.value == 14, 'HP'] = 12
dfrank.loc[dfrank.value == 15, 'HP'] = 11
dfrank.loc[dfrank.value == 16, 'HP'] = 10
dfrank.loc[dfrank.value == 17, 'HP'] = 9
dfrank.loc[dfrank.value == 18, 'HP'] = 8
dfrank.loc[dfrank.value == 19, 'HP'] = 7
dfrank.loc[dfrank.value == 20, 'HP'] = 6
dfrank.loc[(dfrank.value > 20)&(dfrank.value <= 50), 'HP'] = 5

df2=pd.concat([df, dfrank])
有趣

我不确定我是否完全理解你所有的问题,但这是我对上半场的看法

import pandas as pd
df = {
  'columA':['1A','ws rank','rank','ws rank','rank','Drank'],
 'value': [ 1, 12, 34, 50, 3,2]
}

df = pd.DataFrame(df)

df["hp"]=0

def calc_hp(row):

    rv=0
    if row['columA'] in['ws rank','rank','Drank']:
        rv=25-int(row['value'])        
    return rv

df['hp'] = df.apply(calc_hp,axis=1)

df
返回

columA  value   hp
0   1A  1   0
1   ws rank 12  13
2   rank    34  -9
3   ws rank 50  -25
4   rank    3   22
5   Drank   2   23

我将整行传递给apply函数,然后(希望)使用您指定的逻辑。

在Pandas中,当您选择数据并将其存储在新变量中时,为数据帧编制索引将返回对初始数据帧的引用。因此,您应该
复制
数据帧,以便为新数据帧使用
.loc
,即

dfrank=df[df["columA"].str.contains('ws rank|rank')].copy()
这将创建新索引,并帮助您正确地为新的数据帧编制索引

由于要映射数据,可以通过创建
字典
掩码
,然后创建
.loc
,来去除这些行,您可以使用
填充Nan值,即

dicct = {1:25,2:24,3:23,4:22,5:21,6:20,7:19,8:18,9:17,10:16,11:15,12:14,13:13,14:12,15:11,16:10,17:9,18:8,19:7,20:6}
df['HP'] = 0
mask=df["columA"].str.contains('ws rank|rank')
df.loc[mask,'HP'] = df.loc[mask,'value'].map(dicct).fillna(5)
df['HPpoint']=df.groupby('columA')['HP'].transform(sum)
输出:

columA value HP 0 1A 1.0 0.0 1 ws rank 14.0 12.0 2 rank 5.0 21.0 3 ws rank 5.0 21.0 4 rank 23.0 5.0 5 Drank 24.0 5.0 In [ ]: columA value HP HPpoint 0 1A 1.0 0.0 0.0 1 ws rank 14.0 12.0 33.0 2 rank 5.0 21.0 26.0 3 ws rank 5.0 21.0 33.0 4 rank 23.0 5.0 26.0 5 Drank 24.0 5.0 5.0 输出:

columA value HP 0 1A 1.0 0.0 1 ws rank 14.0 12.0 2 rank 5.0 21.0 3 ws rank 5.0 21.0 4 rank 23.0 5.0 5 Drank 24.0 5.0 In [ ]: columA value HP HPpoint 0 1A 1.0 0.0 0.0 1 ws rank 14.0 12.0 33.0 2 rank 5.0 21.0 26.0 3 ws rank 5.0 21.0 33.0 4 rank 23.0 5.0 26.0 5 Drank 24.0 5.0 5.0 柱值HP点 0 1A 1.0 0.0.0 1 ws-rank 14.0 12.0 33.0 2排名5.0 21.0 26.0 3 ws-rank 5.0 21.0 33.0 4排名23.0 5.0 26.0 5人喝了24.0 5.0 5.0
希望它有帮助

您可以用
dfrank['HP']=26-dfrank.value
或类似值替换这两行重复代码。不需要为每个号码分别设置箱子!至于其他问题,你的问题太复杂了,子问题太多了,而且你没有样本输入数据。@John Zwinck说得对!只是好奇,如果这些条件没有规律,有没有更简单的方法?但当我使用您建议的方法时,仍然会收到相同的错误消息。请简化您的代码。简化你的问题。把它编辑下来,这样你就可以问一个具体的问题。现在太复杂了。每篇文章只问一件事,而不是三件事。@Jessica在没有复制数据帧的情况下编制索引会导致此错误。看看我的答案。希望如此helps@JohnZwinck我问了两件我用粗体和数字表示的主要事情。我过去这样做没有任何问题,我不能把它们分开,因为它们是相互关联的。它看起来很混乱,因为我的代码的性质,我要求一个更简单的方法,以及它给我的错误消息。根据我过去关于stackoverflow的经验,人们总是要求显示完整的错误消息,以便更好地提供帮助。你为什么要投我反对票