[英]Python apply function to each row of DataFrame
我有两列 DataFrame: Type
和Name
。 每个单元格中的值都是等长的列表,即我们有对(Type, Name)
。 我想要:
Name
Type
Name
的值创建列Type
我当前的代码是一个 for 循环:
for idx, row in df.iterrows():
for t in list(set(row["Type"])):
df.at[idx, t] = [row["Name"][i] for i in range(len(row["Name"])) if row["Type"][i] == t]
但它的工作速度很慢。 如何加快此代码的速度?
编辑这是说明我想要获得但以更快的方式获得的代码示例:
import pandas as pd
df = pd.DataFrame({"Type": [["1", "1", "2", "3"], ["2","3"]], "Name": [["A", "B", "C", "D"], ["E", "F"]]})
unique = list(set(row["Type"]))
for t in unique:
df[t] = None
df[t] = df[t].astype('object')
for idx, row in df.iterrows():
for t in unique:
df.at[idx, t] = [row["Name"][i] for i in range(len(row["Name"])) if row["Type"][i] == t]
您可以编写一个函数my_function(param)然后执行以下操作:
df['type'] = df['name'].apply(lambda x: my_function(x))
使用 lambda 函数可能有更好的选择,但我记得 lambda。 如果您发布原始数据的简化模拟以及所需输出的外观,它可能会帮助您找到问题的最佳答案。 我不确定我是否理解你想要做什么。 文字分组应该使用Dataframes 的 groupby 方法来完成。
如果我理解正确,您的数据框看起来像这样:
df = pd.DataFrame({'Name':['a,b,c','d,e,f,g'], 'Type':['3,3,2','1,2,2,1']})
Name Type
0 a,b,c 3,3,2
1 d,e,f,g 1,2,2,1
其中元素是字符串列表。 从运行开始:
df['Name:Type'] = (df['Name']+":"+df['Type']).map(process)
使用:
def process(x):
x_,y_ = x.split(':')
x_ = x_.split(','); y_ = y_.split(',')
s = zip(x_,y_)
str_ = ','.join(':'.join(y) for y in s)
return str_
然后你会得到:
这将问题减少到单个列。 最后生成所需的数据框:
l = ','.join(df['Name:Type'].to_list()).split(',')
pd.DataFrame([i.split(':') for i in l], columns=['Name','Type'])
是你想要的结果吗? (如果没有,那么在您的问题中添加所需输出的示例):
res = df.explode(['Name','Type']).groupby('Type')['Name'].agg(list)
print(res)
'''
Type
1 [A, B]
2 [C, E]
3 [D, F]
Name: Name, dtype: object
UPD
df1 = df.apply(lambda x: pd.Series(x['Name'],x['Type']).groupby(level=0).agg(list).T,1)
res = pd.concat([df,df1],axis=1)
print(res)
'''
Type Name 1 2 3
0 [1, 1, 2, 3] [A, B, C, D] [A, B] [C] [D]
1 [2, 3] [E, F] NaN [E] [F]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.