Pandas 新列基于不同的其他列,具体取决于另一列的值
抱歉,标题可能比问题本身更复杂;) 我有一个数据帧Pandas 新列基于不同的其他列,具体取决于另一列的值,pandas,lookup,calculated-columns,Pandas,Lookup,Calculated Columns,抱歉,标题可能比问题本身更复杂;) 我有一个数据帧 grh anc anc1 anc2 anc3 anc4 anc5 anc6 anc7 1 2 5 0.10000 0.12000 0.1800 0.14000 0.15000 0.1900 0.20000 2 3 7 0.03299 0.05081 0.0355 0.02884 0.03054 0.0332 0.031
grh anc anc1 anc2 anc3 anc4 anc5 anc6 anc7
1 2 5 0.10000 0.12000 0.1800 0.14000 0.15000 0.1900 0.20000
2 3 7 0.03299 0.05081 0.0355 0.02884 0.03054 0.0332 0.03115
3 4 3 0.00000 0.00000 0.0000 0.00000 0.00000 0.0000 0.00000
4 5 4 0.00000 0.00000 0.0000 0.00000 0.00000 0.0000 0.00000
5 6 1 0.10000 0.10000 0.1000 0.10000 0.10000 0.1000 0.10000
anc8 anc9 anc10
1 0.10000 0.21000 0.24000
2 0.02177 0.04903 0.04399
3 0.00000 0.00000 0.00000
4 0.00000 0.00000 0.00000
5 0.10000 0.10000 0.10000
我想根据变量anc的值,添加带有forloop lap1、lap2等的新列。例如,在第一行,anc=5,因此lap1应等于anc5(0.1500),lap2等于anc6(0.1900)…在第二行,lap1=anc7(0.03115),lap2=anc8(0.02177)
因此,输出应该如下所示
grh anc anc1 anc2 anc3 anc4 anc5 anc6 anc7 anc8 anc9 anc10 lap1 lap2 lap3
2 5 0.10000 0.12000 0.18000 0.14000 0.15000 0.19000 0.20000 0.1000 0.21000 0.24000 0.15000 0.19000 0.20000
3 7 0.03299 0.05081 0.0355 0.02884 0.03054 0.0332 0.03115 0.02177 0.04903 0.04399 0.03115 0.02177 0.04903
4 3 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000
5 4 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000
6 1 0.10000 0.10000 0.10000 0.10000 0.10000 0.10000 0.10000 0.10000 0.10000 0.10000 0.10000 0.10000 0.10000
我试过一些非常基本的东西,但似乎不起作用
for i in range(1,4):
j=df['anc']+i
df['lap'+str(i)]= df['anc'+str(j)]
如果你有任何想法,我将不胜感激。
Thks有点“暴力”的方法,但我看不出你怎么能不这样做:
df[[f“lap{i}”表示范围(1,4)内的i]=\
df.应用(λx:\
pd.级数({f“lap{j}):范围(1,4)}内j的x[f”anc{int(j+x['anc']-1)}]\
,轴=1)
(假设根据您的样本,您在3处有max
lap
)设置grh
&anc
作为索引,因为我们希望索引到anc[1-9]
列中。当我们编写输出列时,这也很方便:
df2 = df.set_index(['grh', 'anc'])
对于使用anc
值(现在在索引中)插入列中的每个行片段,取3个相邻的值,将它们转换为一个序列,并按照您在输出中预期的名称将它们指定给匹配的输出列
outcols = ['lap1', 'lap2', 'lap3']
df2[outcols] = df2.apply(lambda x: pd.Series(x[x.name[1]-1:x.name[1]+2].values, index=outcols), axis=1)
df2如下所示:
anc1 anc2 anc3 anc4 anc5 anc6 anc7 anc8 anc9 anc10 lap1 lap2 lap3
grh anc
2 5 0.10000 0.12000 0.1800 0.14000 0.15000 0.1900 0.20000 0.10000 0.21000 0.24000 0.15000 0.19000 0.20000
3 7 0.03299 0.05081 0.0355 0.02884 0.03054 0.0332 0.03115 0.02177 0.04903 0.04399 0.03115 0.02177 0.04903
4 3 0.00000 0.00000 0.0000 0.00000 0.00000 0.0000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000
5 4 0.00000 0.00000 0.0000 0.00000 0.00000 0.0000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000
6 1 0.10000 0.10000 0.1000 0.10000 0.10000 0.1000 0.10000 0.10000 0.10000 0.10000 0.10000 0.10000 0.10000
如果要将grh
和anc
恢复为列,请再次重置索引
替代基于名称的查找而不是位置查找: 定义一个实用程序函数,以执行浮点提供的列查找。它需要接受浮点,因为如果序列包含任何非整数值,pandas会自动将int64向上转换为浮点64。使用此函数执行查找并分配输出。这种方法的一个好处是不需要设置索引
def cols(n,p): return [f'{p}{i}' for i in range(int(n), int(n+3))]
df[cols(1, 'lap')] = df.apply(lambda x: pd.Series(x[cols(x.anc, 'anc')].values), axis=1)
以下是我得到的输出:
grh anc anc1 anc2 anc3 anc4 anc5 anc6 anc7 anc8 anc9 anc10 lap1 lap2 lap3 lap4 lap5 lap6
0 2 5 0.10000 0.12000 0.1800 0.14000 0.15000 0.1900 0.20000 0.10000 0.21000 0.24000 0.15000 0.19000 NaN NaN NaN NaN
1 3 7 0.03299 0.05081 0.0355 0.02884 0.03054 0.0332 0.03115 0.02177 0.04903 0.04399 0.03115 0.02177 0.04903 NaN NaN NaN
2 4 3 0.00000 0.00000 0.0000 0.00000 0.00000 0.0000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.0 NaN NaN
3 5 4 0.00000 0.00000 0.0000 0.00000 0.00000 0.0000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.0 0.0 NaN
4 6 1 0.10000 0.10000 0.1000 0.10000 0.10000 0.1000 0.10000 0.10000 0.10000 0.10000 0.10000 0.10000 0.10000 0.1 0.1 0.1
让我知道这是否为您正在寻找的解决方案提供了某种类型的解决方案您是否可以提供一个您想要的示例输出,给定此数据帧,请在此详述,谢谢您的观点。我已经添加了我想要获得的输出.Thks。好像不管用TypeError:“str”对象不能解释为整数/KeyError:(“anc5.0”,“发生在索引1上”)“我添加了一行-请尝试:
df['anc']=df['anc']”。在它之前,astype(int)
不会更改任何内容:(仍然是相同的错误。但是你以前应用过它,对吗?我的意思是-它应该按原样工作,只要你anc
column存储整数。是的,我首先应用了它。Entrée[70]:df['anc']=df['anc'].astype(int)df['anc'].dtype Out[70]:dtype('int32')然后我尝试你的代码,让我与你共享的错误缓解了OP对我的答案的问题,但是如果列无序…@GrzegorzSkibinski,那么OP可以在应用我的程序之前对它们的列进行排序感谢你的详细答案,这对我非常有用。但是,我仍然有以下错误:ValueError:(“传递值的长度为1,索引意味着3”,“发生在索引(4,10)”@Bebio,您在共享的样本或完整数据集上是否发现此错误?@Haleemur Ali-更正,这将破坏按顺序调用与按名称调用的目的:)您好,谢谢您的建议。这与我的问题并不匹配。要添加的新圈列数与grh数无关。在示例中它等于3。明白了。我没有看到新圈列数是固定的,它们是3。对于此新信息,只需做两次更改即可修复代码。更改为:#numNewCols=df.grh.max()#我应该填写多少圈数值##注释代码Hown=3#我应该填写多少圈数值##新代码
grh anc anc1 anc2 anc3 anc4 anc5 anc6 anc7 anc8 anc9 anc10 lap1 lap2 lap3 lap4 lap5 lap6
0 2 5 0.10000 0.12000 0.1800 0.14000 0.15000 0.1900 0.20000 0.10000 0.21000 0.24000 0.15000 0.19000 NaN NaN NaN NaN
1 3 7 0.03299 0.05081 0.0355 0.02884 0.03054 0.0332 0.03115 0.02177 0.04903 0.04399 0.03115 0.02177 0.04903 NaN NaN NaN
2 4 3 0.00000 0.00000 0.0000 0.00000 0.00000 0.0000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.0 NaN NaN
3 5 4 0.00000 0.00000 0.0000 0.00000 0.00000 0.0000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.0 0.0 NaN
4 6 1 0.10000 0.10000 0.1000 0.10000 0.10000 0.1000 0.10000 0.10000 0.10000 0.10000 0.10000 0.10000 0.10000 0.1 0.1 0.1