在dataframe python中,根据上面的值分配值
我有一个数据帧df1:在dataframe python中,根据上面的值分配值,python,pandas,dataframe,Python,Pandas,Dataframe,我有一个数据帧df1: df1 = pd.DataFrame(data = {'DF_1A' : ["A", 2, "B", 4, 5,6], 'DF_1B' : [10, 25, 40, 10, 15,12],'DF_3B' : np.nan}) 如果DF_1A中是数字(同一行),我必须为DF_3B赋值。 I上面有一个值,那么值是100,B是200。 毕竟,表格应该是这样的: 编辑: 所以我试着用另一种方式来解释。 将有穿过DF_1A柱的回路。让循环的每个元素都是x。然后: -如果x是
df1 = pd.DataFrame(data = {'DF_1A' : ["A", 2, "B", 4, 5,6], 'DF_1B' : [10, 25, 40, 10, 15,12],'DF_3B' : np.nan})
如果DF_1A中是数字(同一行),我必须为DF_3B赋值。I上面有一个值,那么值是100,B是200。 毕竟,表格应该是这样的: 编辑: 所以我试着用另一种方式来解释。 将有穿过DF_1A柱的回路。让循环的每个元素都是x。然后:
-如果x是一个字母,则什么也不做
-如果x是数字,则有两种可能性
a) 如果x上方一行的值为字母,则在同一行的DF_3B列中指定字母(100或200)的等效值,其中为x
b) 如果x上方一行的值为数字,则在同一行的DF_3B列中,从上面一行中指定值DF_3B,其中为x 或者有其他更简单的方法 谢谢,,
Jarek不是最好的解决方案,但这会起作用:
d1=pd.DataFrame(数据={'dfu 1A':[“A”,2,“B”,4,5,6],'DF_1B':[10,25,40,10,15,12],'DF_3B':np.nan}
d1['temp']=np.where(d1['DF_1A'].shift(1)='A',1,2)
d1['DF_3B']=np.where(d1['DF_1A'].str.isdigit(),100,np.nan)*d1['temp']
d1.drop('temp',轴=1,在位=True)
d1.head()。您没有指定如何存储替换值,因此我假设使用字典:
import pandas as pd
import numpy as np
df1 = pd.DataFrame(data = {'DF_1A' : ["A", 2, "B", 4, 5, 6, "A", 8, 9, 10], 'DF_1B' : [10, 25, 40, 10, 15, 12, 1, 3.7, 5, -2], 'DF_3B' : np.nan})
#transcription dictionary
transcr = {"A": 100, "B": 200}
#transfer values from row DF_1A to DF_3B, if they are in the dictionary
df1["DF_3B"] = df1.loc[df1["DF_1A"].isin(transcr), "DF_1A"]
#forward filling and substition of letters with values
df1["DF_3B"] = df1["DF_3B"].fillna(method='ffill').replace(transcr)
#resetting rows that contain letters to NaN
df1.loc[df1["DF_1A"].isin(transcr), "DF_3B"] = np.nan
print(df1)
输出
DF_1A DF_1B DF_3B
0 A 10.0 NaN
1 2 25.0 100.0
2 B 40.0 NaN
3 4 10.0 200.0
4 5 15.0 200.0
5 6 12.0 200.0
6 A 1.0 NaN
7 8 3.7 100.0
8 9 5.0 100.0
9 10 -2.0 100.0
请澄清“I上面有一个值,那么B的值是100,B的值是200。”如果DF_1A列中有一个上面的数值,那么DF_3B列中的值(与数字行在同一行)是100,B的值是200。请查看输出表以了解想法-DF_3B列。仍然不清楚。请您解释一下:“我在DF_1A列中有一个以上的数值,那么在DF_3B列中与数字行相同的行中的数值是100,对于B来说是200。”似乎@Jarek的意思是如果不是(DF_1A[I].isdigit()),那么NaN elseif DF_1A[I-1]='A'&DF_1A[I]。isdigit()那么100,否则200我就是表示感谢您对shiftng的想法!我想我可以用它来写一些代码:)当然,在同一个数据集上使用shift和sort时要小心,因为shift操作索引,sort不会隐式重置索引。谢谢!我曾想过使用字典,但不知道如何实现它。那更适合我的需要。谢谢