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获取输出数据: