在 Pandas DataFrame 的列内创建修改值
Creating Modified Values inside a Column in Pandas DataFrame
我不确定这个问题有多严重。但我有问题需要帮助:
我有一个示例 pandas datframe 如下(比如说):
df
C A V D
9 apar 1 0
8 bpar 4 8
7 cpar 7 7
0 apar 8 6
8 apar 9 4
9 bpar 3 2
所以我需要做的是附加现有的数据框,每当我有 'A' col 有 'apar',然后创建一个新值作为 'apar_t' 并更改'V' 的值 say( 0.5) 并更新数据帧。所以在这个玩具示例中,我的数据框应该如下所示:
df
C A V D
9 apar 1.0 0
8 bpar 4.0 8
7 cpar 7.0 7
0 apar 8.0 6
8 apar 9.0 4
9 bpar 3.0 2
9 apar_t 0.5 0
0 apar_t 7.5 6
8 apar_t 8.5 4
我一直在做并且能够解决这个问题,但我认为它不是 pythonic 并且对于庞大的数据集来说效率不高。如果我能找到更好的方法来解决问题,我会请求;
我所做的是:
sub_df = df[df['A']=='apar']
colsOrder = df.columns
sub_df = sub_df.rename(columns={'A': 'A1', 'V': 'V1'})
sub_df['A'] ='apar_t'
sub_df['V'] = sub_df['V1'] - 0.5
sub_df.drop(columns=['A1', 'V1'])
sub_df = sub_df[colsOrder]
frames =[df,sub_df]
DF = pd.concat(frames).reset_index(drop=True)
DF
代码有效,我得到了我想要的。但我一直在寻找一种更优雅的 pythonic 和高效的解决方案。任何帮助将不胜感激。
x = df.loc[df.A == "apar"].copy()
x.loc[:, "V"] = x.loc[:, "V"] - 0.5
x.loc[:, "A"] = x.loc[:, "A"] + "_t"
out = pd.concat([df, x])
print(out)
打印:
C A V D
0 9 apar 1.0 0
1 8 bpar 4.0 8
2 7 cpar 7.0 7
3 0 apar 8.0 6
4 8 apar 9.0 4
5 9 bpar 3.0 2
0 9 apar_t 0.5 0
3 0 apar_t 7.5 6
4 8 apar_t 8.5 4
如果您只是在行值中添加或减去值,这是一种干净的方法:
pd.concat([df, df.loc[df.A == 'apar'].apply(
lambda row: row.add([0, '_t', -0.5, 0]), axis=1)])
数据框:
C A V D
0 9 apar 1.0 0
1 8 bpar 4.0 8
2 7 cpar 7.0 7
3 0 apar 8.0 6
4 8 apar 9.0 4
5 9 bpar 3.0 2
0 9 apar_t 0.5 0
3 0 apar_t 7.5 6
4 8 apar_t 8.5 4
否则,您可以为行转换定义一个函数:
def transform_row(row):
row['A'] = row['A'] + '_t'
row['V'] = row['V'] - 0.5
return row
然后使用apply
pd.concat([df, df.loc[df.A == 'apar'].apply(transform_row, axis=1)])
生成的数据帧与上述相同。
我不确定这个问题有多严重。但我有问题需要帮助:
我有一个示例 pandas datframe 如下(比如说):
df
C A V D
9 apar 1 0
8 bpar 4 8
7 cpar 7 7
0 apar 8 6
8 apar 9 4
9 bpar 3 2
所以我需要做的是附加现有的数据框,每当我有 'A' col 有 'apar',然后创建一个新值作为 'apar_t' 并更改'V' 的值 say( 0.5) 并更新数据帧。所以在这个玩具示例中,我的数据框应该如下所示:
df
C A V D
9 apar 1.0 0
8 bpar 4.0 8
7 cpar 7.0 7
0 apar 8.0 6
8 apar 9.0 4
9 bpar 3.0 2
9 apar_t 0.5 0
0 apar_t 7.5 6
8 apar_t 8.5 4
我一直在做并且能够解决这个问题,但我认为它不是 pythonic 并且对于庞大的数据集来说效率不高。如果我能找到更好的方法来解决问题,我会请求;
我所做的是:
sub_df = df[df['A']=='apar']
colsOrder = df.columns
sub_df = sub_df.rename(columns={'A': 'A1', 'V': 'V1'})
sub_df['A'] ='apar_t'
sub_df['V'] = sub_df['V1'] - 0.5
sub_df.drop(columns=['A1', 'V1'])
sub_df = sub_df[colsOrder]
frames =[df,sub_df]
DF = pd.concat(frames).reset_index(drop=True)
DF
代码有效,我得到了我想要的。但我一直在寻找一种更优雅的 pythonic 和高效的解决方案。任何帮助将不胜感激。
x = df.loc[df.A == "apar"].copy()
x.loc[:, "V"] = x.loc[:, "V"] - 0.5
x.loc[:, "A"] = x.loc[:, "A"] + "_t"
out = pd.concat([df, x])
print(out)
打印:
C A V D
0 9 apar 1.0 0
1 8 bpar 4.0 8
2 7 cpar 7.0 7
3 0 apar 8.0 6
4 8 apar 9.0 4
5 9 bpar 3.0 2
0 9 apar_t 0.5 0
3 0 apar_t 7.5 6
4 8 apar_t 8.5 4
如果您只是在行值中添加或减去值,这是一种干净的方法:
pd.concat([df, df.loc[df.A == 'apar'].apply(
lambda row: row.add([0, '_t', -0.5, 0]), axis=1)])
数据框:
C A V D
0 9 apar 1.0 0
1 8 bpar 4.0 8
2 7 cpar 7.0 7
3 0 apar 8.0 6
4 8 apar 9.0 4
5 9 bpar 3.0 2
0 9 apar_t 0.5 0
3 0 apar_t 7.5 6
4 8 apar_t 8.5 4
否则,您可以为行转换定义一个函数:
def transform_row(row):
row['A'] = row['A'] + '_t'
row['V'] = row['V'] - 0.5
return row
然后使用apply
pd.concat([df, df.loc[df.A == 'apar'].apply(transform_row, axis=1)])
生成的数据帧与上述相同。