Python 根据特定条件填写列

Python 根据特定条件填写列,python,python-3.x,pandas,Python,Python 3.x,Pandas,我有一个数据帧df1: Site cells national plan value T13630 G13630B 225 T13631 G13631A T13631 U13631A 57 T13672 G13672A 310 T13802 G13802A 150 T13802 G13802B 151 T13802 U13802A T13880 G13880A 274 T13880 U13880B T33281 U33281A 我需要数据帧df2,以便根据

我有一个数据帧
df1

Site    cells   national plan value
T13630  G13630B 225
T13631  G13631A 
T13631  U13631A 57
T13672  G13672A 310
T13802  G13802A 150
T13802  G13802B 151
T13802  U13802A 
T13880  G13880A 274
T13880  U13880B 
T33281  U33281A 
我需要数据帧
df2
,以便根据某些条件填写“国家计划值”列中的空白

条件首先考虑具有空白国家计划值的单元格。如果任何其他单元具有相同的场地名称(另一个单元可以位于该单元的上方/下方),并且如果该单元的最后一个字母匹配,例如G13631A和U13631A,则将U13631A的国家计划值复制到G13631A,否则写“无共同点”

因此,我的结果数据帧
df2
应该有如下内容:

Site    cells   national plan value
T13630  G13630B 225
T13631  G13631A 57
T13631  U13631A 57
T13672  G13672A 310
T13802  G13802A 150
T13802  G13802B 151
T13802  U13802A 150
T13880  G13880A 274
T13880  U13880B no-cosector
T33281  U33281A no-cosector

创建一个新列,用于标识属于同一类的行:

df1['ind'] = df1['Site'] + df1['cells'].str[-1]
df1.loc[~df1.duplicated(subset='ind') & df1['npv'].isnull(), 'npv'] = 'no-cosector'
df1['npv'].ffill(inplace=True)
按该列排序。这样,属于同一类的所有行都是连续的:

df1.sort_values(['ind', 'npv'], inplace=True)
填充同一类中没有重复项的行:

df1['ind'] = df1['Site'] + df1['cells'].str[-1]
df1.loc[~df1.duplicated(subset='ind') & df1['npv'].isnull(), 'npv'] = 'no-cosector'
df1['npv'].ffill(inplace=True)
填充同一类中存在重复项的行:

df1['ind'] = df1['Site'] + df1['cells'].str[-1]
df1.loc[~df1.duplicated(subset='ind') & df1['npv'].isnull(), 'npv'] = 'no-cosector'
df1['npv'].ffill(inplace=True)
移除临时柱:

df1.drop('ind',axis=1)
享受:

#     Site    cells          npv
#0  T13630  G13630B          225
#2  T13631  U13631A           57
#1  T13631  G13631A           57
#3  T13672  G13672A          310
#4  T13802  G13802A          150
#6  T13802  U13802A          150
#5  T13802  G13802B          151
#7  T13880  G13880A          274
#8  T13880  U13880B  no-cosector
#9  T33281  U33281A  no-cosector

创建一个新列,用于标识属于同一类的行:

df1['ind'] = df1['Site'] + df1['cells'].str[-1]
df1.loc[~df1.duplicated(subset='ind') & df1['npv'].isnull(), 'npv'] = 'no-cosector'
df1['npv'].ffill(inplace=True)
按该列排序。这样,属于同一类的所有行都是连续的:

df1.sort_values(['ind', 'npv'], inplace=True)
填充同一类中没有重复项的行:

df1['ind'] = df1['Site'] + df1['cells'].str[-1]
df1.loc[~df1.duplicated(subset='ind') & df1['npv'].isnull(), 'npv'] = 'no-cosector'
df1['npv'].ffill(inplace=True)
填充同一类中存在重复项的行:

df1['ind'] = df1['Site'] + df1['cells'].str[-1]
df1.loc[~df1.duplicated(subset='ind') & df1['npv'].isnull(), 'npv'] = 'no-cosector'
df1['npv'].ffill(inplace=True)
移除临时柱:

df1.drop('ind',axis=1)
享受:

#     Site    cells          npv
#0  T13630  G13630B          225
#2  T13631  U13631A           57
#1  T13631  G13631A           57
#3  T13672  G13672A          310
#4  T13802  G13802A          150
#6  T13802  U13802A          150
#5  T13802  G13802B          151
#7  T13880  G13880A          274
#8  T13880  U13880B  no-cosector
#9  T33281  U33281A  no-cosector

您可以使用cells col的最后一个字符构建列,然后使用groupby Site和最后一个字符列构建列。最后填写相应的na

df_new = (
     df1.assign(cells_last=df1.cells.str.slice(-1))
     .groupby(['Site','cells_last'])
     .apply(lambda x: x.bfill().ffill())
     .fillna('no-cosector')
     .reindex(columns=df1.columns)
     )

df_new
Out[104]: 
     Site    cells national_plan_value
0  T13630  G13630B                 225
1  T13631  G13631A                  57
2  T13631  U13631A                  57
3  T13672  G13672A                 310
4  T13802  G13802A                 150
5  T13802  G13802B                 151
6  T13802  U13802A                 150
7  T13880  G13880A                 274
8  T13880  U13880B         no-cosector
9  T33281  U33281A         no-cosector

您可以使用cells col的最后一个字符构建列,然后使用groupby Site和最后一个字符列构建列。最后填写相应的na

df_new = (
     df1.assign(cells_last=df1.cells.str.slice(-1))
     .groupby(['Site','cells_last'])
     .apply(lambda x: x.bfill().ffill())
     .fillna('no-cosector')
     .reindex(columns=df1.columns)
     )

df_new
Out[104]: 
     Site    cells national_plan_value
0  T13630  G13630B                 225
1  T13631  G13631A                  57
2  T13631  U13631A                  57
3  T13672  G13672A                 310
4  T13802  G13802A                 150
5  T13802  G13802B                 151
6  T13802  U13802A                 150
7  T13880  G13880A                 274
8  T13880  U13880B         no-cosector
9  T33281  U33281A         no-cosector

步骤1,创建一个新列:

df["cellsend"] = df["cells"].str.slice(1)
步骤2,使用
sort_值
groupby
填写na:

df.sort_values(["Site", "cellsend", "national plan value"]).groupby(["Site", "cellsend"]).ffill().drop(["cellsend"], axis=1).fillna("no-cosector")
输出:

    Site    cells       national plan value
0   T13630  G13630B     225
2   T13631  U13631A     57
1   T13631  G13631A     57
3   T13672  G13672A     310
4   T13802  G13802A     150
6   T13802  U13802A     150
5   T13802  G13802B     151
7   T13880  G13880A     274
8   T13880  U13880B     no-cosector
9   T33281  U33281A     no-cosector

步骤1,创建一个新列:

df["cellsend"] = df["cells"].str.slice(1)
步骤2,使用
sort_值
groupby
填写na:

df.sort_values(["Site", "cellsend", "national plan value"]).groupby(["Site", "cellsend"]).ffill().drop(["cellsend"], axis=1).fillna("no-cosector")
输出:

    Site    cells       national plan value
0   T13630  G13630B     225
2   T13631  U13631A     57
1   T13631  G13631A     57
3   T13672  G13672A     310
4   T13802  G13802A     150
6   T13802  U13802A     150
5   T13802  G13802B     151
7   T13880  G13880A     274
8   T13880  U13880B     no-cosector
9   T33281  U33281A     no-cosector

你能帮我如何附加excel吗?我找不到任何选择here@Sam我认为这个问题有足够的信息来重现一个问题。不需要额外的文件或数据。请找到excel的链接:@AkshayNevrekar:我要求提供该文件,这样我就不必创建一个示例文件来尝试解决该问题。你能帮我如何附加excel吗?我找不到任何选择here@Sam我认为这个问题有足够的信息来重现一个问题。不需要额外的文件或数据。请找到excel的链接:@AkshayNevrekar:我要求提供该文件,这样我就不必创建一个示例文件来尝试解决该问题。但我对此有一个问题。。。它将填充其他列中的空白。。它不应该填充除“npv”列之外的其他列请参见修改后的answer.link以获取原始文件:link以获取输出数据:但我对此有一个问题。。。它将填充其他列中的空白。。它不应填充除“npv”列以外的其他列原始文件请参见修改后的answer.link:link获取输出数据: