英文:
Taking specific DataFrame row values and moving them to another new column
问题
我有一个如下的DataFrame:
Column1 Column2
'a' 'b'
'amount' '$d'
'e' 'f'
'amount' '$g'
...
我创建了一个新的列'Column3',我想要获取$d,$g等值(任何直接在'amount'值右边的值),并将它们移到Column3,同时去掉'amount'的值:
Column1 Column2 Column3
a b $d
e f $g
...
将这些值移到Column3并去掉'amount'值的最佳方法是什么?
英文:
I have a DataFrame as follows:
Column1 Column2
'a' 'b'
'amount' '$d'
'e' 'f'
'amount' '$g'
...
I created a new column 'Column3', where I would like to take the values of $d, $g, etc. (any value that is directly right to a value 'amount') and move them to Column 3, while also getting rid of value 'amount':
Column1 Column2 Column3
a b $d
e f $g
...
What would be the best way to move these values to Column3 and remove 'amount' values?
EDIT: Made the values more specific to the question.
答案1
得分: 1
这里是一种方法:
- 创建一个布尔系列,其中
True
表示"Column1"等于"amount"(Series.eq
)。 - 对"Column2"应用
Series.where
以获取"amount"旁边的值,并使用df.shift
将结果向上移动一行。 - 然后,我们使用
df.assign
将该系列添加到df
中,并使用布尔系列的否定(~
) 从df
中选择。 - 连锁使用
df.reset_index
以获得"干净"的索引。
m = df['Column1'].eq('amount')
res = df.assign(Column3=df['Column2'].where(m).shift(-1))[~m].reset_index(drop=True)
res
Column1 Column2 Column3
0 a b $d
1 e f $g
英文:
Here's one approach:
- Create a boolean series with
True
where "Column1" equals "amount"(Series.eq
). - Apply
Series.where
to "Column2" to get values next to "amount", and usedf.shift
to shift the result one row up. - Next, we add the series to the
df
withdf.assign
, and select from thedf
using the inverse (~
) of the boolean series. - Chain
df.reset_index
for a "clean" index.
m = df['Column1'].eq('amount')
res = df.assign(Column3=df['Column2'].where(m).shift(-1))[~m].reset_index(drop=True)
res
Column1 Column2 Column3
0 a b $d
1 e f $g
答案2
得分: 1
out = df[df["Column1"].ne("amount")].join(df["Column2"].rename("Column3").shift(-1))
Output :
print(out)
Column1 Column2 Column3
0 a b $d
2 e f $g
英文:
out = df[df["Column1"].ne("amount")].join(df["Column2"].rename("Column3").shift(-1))
Output :
print(out)
Column1 Column2 Column3
0 a b $d
2 e f $g
答案3
得分: 1
以下是翻译好的部分:
这是一种执行方法:
- 选择要移至新列的
Column2
中的值 - 创建一个新的数据框,去掉那些
["Column1"] != "c"
的行,并将预先选择的值分配到新列中 - (可选)如果需要,重置索引
示例:
# 预先选择要从`Column2`移动的值
data_to_move = df[df['Column1'] == 'c']['Column2'].values
# 删除`Column1`等于`c`的行,将预先选择的数据分配到新列中
reshaped_data = df[df['Column1'] != 'c'].copy().reset_index(drop=True)
reshaped_data['Column3'] = data_to_move
reshaped_data
英文:
Here is one way of doing it:
- Select values from
Column2
that you want to move to a new column - Create a new df, omitting rows where
["Column1"] != "c"
, and assign the pre-selected values to a new column - (optional) reset index if you want to
Example:
# Pre-select values you want to move from `Column2`
data_to_move = df[df['Column1'] == 'c']['Column2'].values
# Drop rows where 'Column1' equals 'c', assigned pre-selected data to a new column
reshaped_data = df[df['Column1'] != 'c'].copy().reset_index(drop=True)
reshaped_data['Column3'] = data_to_move
reshaped_data
答案4
得分: 1
你可以使用一个布尔遮罩:
m = df['Column1'] == 'amount'
df = df[~m].assign(Amount=df.loc[m, 'Column2'].values).reset_index(drop=True)
输出:
>>> df
Column1 Column2 Amount
0 a b $d
1 e f $g
英文:
You can use a boolean mask:
m = df['Column1'] == 'amount'
df = df[~m].assign(Amount=df.loc[m, 'Column2'].values).reset_index(drop=True)
Output:
>>> df
Column1 Column2 Amount
0 a b $d
1 e f $g
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论