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的经验,人们总是要求显示完整的错误消息,以便更好地提供帮助。你为什么要投我反对票