如何将某些单元格值从 Pandas DF 中的 2 列移动到另一个新列?
How do I move some cell values from 2 columns in Pandas DF to another new column?
所以我正在处理以下数据框:
我想做的是将 2 列('elected_in' 和 'campaigned_in_')的数值合并到一个新列中。
此列应如下所示
new_column
- 007
- 南
- 043
- 275
- 027
- 等等
关于如何做到这一点的任何提示?发现所有堆栈溢出答案都与此不太相关,我也不确定要使用什么术语...
提前感谢您的帮助。
您基本上可以使用 new
列组合它们。我建议这样做,因为您在尝试合并的列中将数字和字符串都作为值。请参考以下代码。
import pandas as pd
df = pd.DataFrame(np.array([[7, "Bremen", "test"], [4, 5, 6], ["trial", 8, 43]]),
columns=['elected', 'b', 'campained'])
# Now combine them
df['number'] = df['elected'] + " " +df['campained']
df.head()
如果您只需要数字,那么您可以使用简单的 lambda
函数来实现。
import re as re
def find_number(text):
num = re.findall(r'[0-9]+',text)
return " ".join(num)
df['new']=df['number'].apply(lambda x: find_number(x))
df.head()
编辑:已更改以便输出为字符串格式
def merge(e,c):
if str(e).isnumeric():
return e
elif str(c).isnumeric():
return c
else:
return np.nan
data = {'elected_in':['007', 'Bremen', 'test1', 182],
'campaigned_in_':['sh-h', np.nan, '043', 'test2']
}
df = pd.DataFrame(data)
df['new_column'] = df.apply(lambda x: merge(x.elected_in, x.campaigned_in_), axis = 1)
输出:
elected_in campaigned_in_ new_column
0 007 sh-h 007
1 Bremen NaN NaN
2 test1 043 043
3 182 test2 182
使用 iterrows()
方法遍历行并根据条件替换值(如果 campaigned_in
中的值是字符串,则替换为 elected_in
中的字符串)
import pandas as pd
df = pd.DataFrame({"elected_in" : [0.07, "Bremen", "Nied"]})
df['campaigned_in'] = ["Schleswig",45,275]
df["answer"]=df["campaigned_in"]
for index, row in df.iterrows():
if(isinstance(row["campaigned_in"],str)==True):
row["answer"]=row["elected_in"]
df.head()
更新后的 df 看起来像:
elected_in campaigned_in answer
0 0.07 Schleswig 0.07
1 Bremen 45 45
2 Nied 275 275
所以我正在处理以下数据框:
我想做的是将 2 列('elected_in' 和 'campaigned_in_')的数值合并到一个新列中。
此列应如下所示
new_column
- 007
- 南
- 043
- 275
- 027
- 等等
关于如何做到这一点的任何提示?发现所有堆栈溢出答案都与此不太相关,我也不确定要使用什么术语...
提前感谢您的帮助。
您基本上可以使用 new
列组合它们。我建议这样做,因为您在尝试合并的列中将数字和字符串都作为值。请参考以下代码。
import pandas as pd
df = pd.DataFrame(np.array([[7, "Bremen", "test"], [4, 5, 6], ["trial", 8, 43]]),
columns=['elected', 'b', 'campained'])
# Now combine them
df['number'] = df['elected'] + " " +df['campained']
df.head()
如果您只需要数字,那么您可以使用简单的 lambda
函数来实现。
import re as re
def find_number(text):
num = re.findall(r'[0-9]+',text)
return " ".join(num)
df['new']=df['number'].apply(lambda x: find_number(x))
df.head()
编辑:已更改以便输出为字符串格式
def merge(e,c):
if str(e).isnumeric():
return e
elif str(c).isnumeric():
return c
else:
return np.nan
data = {'elected_in':['007', 'Bremen', 'test1', 182],
'campaigned_in_':['sh-h', np.nan, '043', 'test2']
}
df = pd.DataFrame(data)
df['new_column'] = df.apply(lambda x: merge(x.elected_in, x.campaigned_in_), axis = 1)
输出:
elected_in campaigned_in_ new_column
0 007 sh-h 007
1 Bremen NaN NaN
2 test1 043 043
3 182 test2 182
使用 iterrows()
方法遍历行并根据条件替换值(如果 campaigned_in
中的值是字符串,则替换为 elected_in
中的字符串)
import pandas as pd
df = pd.DataFrame({"elected_in" : [0.07, "Bremen", "Nied"]})
df['campaigned_in'] = ["Schleswig",45,275]
df["answer"]=df["campaigned_in"]
for index, row in df.iterrows():
if(isinstance(row["campaigned_in"],str)==True):
row["answer"]=row["elected_in"]
df.head()
更新后的 df 看起来像:
elected_in campaigned_in answer
0 0.07 Schleswig 0.07
1 Bremen 45 45
2 Nied 275 275