我需要根据pandas数据帧的行索引将值插入到列中。
import pandas as pd
df=pd.DataFrame(np.random.randint(0,100,size=(11, 4)), columns=list('ABCD'))
df['ticker']='na'
df
Sample DataFrame 在上面的示例数据框中,记录总数的前25%的股票行列必须具有值“$”,接下来25%的记录必须具有值“$$”,依此类推。
我试图获取数据帧的长度并计算25,50,75%,然后一次访问一行,并根据行索引为“ticker”赋值。
total_row_count=len(df)
row_25 = int(total_row_count * .25)
row_50 = int(total_row_count * .5)
row_75=int(total_row_count*.75)
if ((row.index >=0) and (row.index<=row_25)):
return"$"
elif ((row.index > row_25) and (row.index<=row_50)):
return"$$"
elif ((row.index > row_50) and (row.index<=row_75)):
return"$$$"
elif (row.index > row_75):
return"$$$$"
但是我无法获得行索引。如果有不同的方式来分配这些值,请告诉我
答案 0 :(得分:1)
我认为cut
可以解决这个问题
df['ticker']=pd.cut(np.arange(len(df))/len(df), [-np.inf,0.25,0.5,0.75,1], labels=["$","$$",'$$$','$$$$'],right=True)
df
Out[35]:
A B C D ticker
0 63 51 19 33 $
1 12 80 57 1 $
2 53 27 62 26 $
3 97 43 31 80 $$
4 91 22 92 11 $$
5 39 70 82 26 $$
6 32 62 17 75 $$$
7 5 59 79 72 $$$
8 75 4 47 4 $$$
9 43 5 45 66 $$$$
10 29 9 74 94 $$$$
答案 1 :(得分:1)
我喜欢使用np.select
来完成这类任务,因为我发现语法直观易读:
# Set up your conditions:
conds = [(df.index >= 0) & (df.index <= row_25),
(df.index > row_25) & (df.index<=row_50),
(df.index > row_50) & (df.index<=row_75),
(df.index > row_75)]
# Set up your target values (in the same order as your conditions)
choices = ['$', '$$', '$$$', '$$$$']
# Assign df['ticker']
df['ticker'] = np.select(conds, choices)
返回:
>>> df
A B C D ticker
0 92 97 25 79 $
1 76 4 26 94 $
2 49 65 19 91 $
3 76 3 83 45 $$
4 83 16 0 16 $$
5 1 56 97 44 $$
6 78 17 18 86 $$$
7 55 56 83 91 $$$
8 76 16 52 33 $$$
9 55 35 80 95 $$$$
10 90 29 41 87 $$$$
答案 2 :(得分:0)
您可以设置一些np.where语句来处理此问题。尝试以下内容:
import numpy as np
...
df['ticker'] = np.where(df.index < row_25, "$", df['ticker'])
df['ticker'] = np.where(row_25 <= df.index < row_50, "$$", df['ticker'])
df['ticker'] = np.where(row_50 <= df.index < row_75, "$$$", df['ticker'])
df['ticker'] = np.where(row_75 <= df.index, "$$$$", df['ticker'])
答案 3 :(得分:0)
这是使用.loc
访问者的一个显式解决方案。
import pandas as pd
df = pd.DataFrame(np.random.randint(0,100,size=(11, 4)), columns=list('ABCD'))
n = len(df.index)
df['ticker'] = 'na'
df.loc[df.index <= n/4, 'ticker'] = '$'
df.loc[(n/4 < df.index) & (df.index <= n/2), 'ticker'] = '$$'
df.loc[(n/2 < df.index) & (df.index <= n*3/4), 'ticker'] = '$$$'
df.loc[df.index > n*3/4, 'ticker'] = '$$$$'
# A B C D ticker
# 0 47 64 7 46 $
# 1 53 55 75 3 $
# 2 93 95 28 47 $
# 3 35 88 16 7 $$
# 4 99 66 88 84 $$
# 5 75 2 72 90 $$
# 6 6 53 36 92 $$$
# 7 83 58 54 67 $$$
# 8 49 83 46 54 $$$
# 9 69 9 96 73 $$$$
# 10 84 42 11 83 $$$$