很抱歉,我对SO的多次尝试都是徒劳的。我需要以下帮助:
我的df如下:
import pandas as pd
df = pd.DataFrame({'subject' : ['Eng' ,'Math', 'Science'], 'role' : ['Teacher', '', 'Dr'], 'ID' : ['123', '444', 'NaN'] })
print(df)
ID role subject
0 123 Teacher Eng
1 444 Math
2 NaN Dr Science
由于这可能是未经验证的数据,所以我通常要做的(在excel boo中)是创建一个备注字段,该字段会聚合数据并且不会在上传时损坏任何好的数据。
所以我一直在尝试使用itterrows来尝试遍历df并将字段合并为一个。需要注意的是,我需要使用/ n分隔同一列中的值(CHAR(10)为您提供Excel Buff)
所以我已经尝试过了。
for index, row in df2.iterrows():
if row['ID'] and row['subject] and row['role'] == "": #search row for any data while leaving out blanks
row['C_MEMO'] = row[['ID', 'subject', 'role']]
else:
pass
但是这实际上没有用,任何建议/帮助将不胜感激。
我想要的输出:
ID role subject C_MEMO
0 123 Teacher Eng 123,
Teacher
Eng
1 444 Math 444,
Math
2 NaN Dr Science Dr,
Science
要考虑的事情:
我正在处理多种数据类型。
我很高兴将新输出作为字符串。
答案 0 :(得分:3)
import pandas as pd
df = pd.DataFrame({'subject' : ['Eng' ,'Math', 'Science'], 'role' : ['Teacher', '', 'Dr'], 'ID' : ['123', '444', 'NaN'] })
df["C_MEMO"] = (df["ID"] + "," + df["role"] + "," + df["subject"]).str.replace(",,", ",")
print(df)
输出:
ID role subject C_MEMO
0 123 Teacher Eng 123,Teacher,Eng
1 444 Math 444,Math
2 NaN Dr Science NaN,Dr,Science
或使用df.apply
df["C_MEMO"] = df.apply(lambda x: ", ".join([x["ID"], x["role"], x["subject"]]).replace(", ,", ","), axis=1)
答案 1 :(得分:2)
使用:
#first replace values
df = df.replace(['', 'NaN'], np.nan)
df["C_MEMO"] = df.apply(lambda x: '\n'.join(x.dropna()), axis=1)
或者如果缺少的值仅是字符串:
df["C_MEMO"] = df.apply(lambda x: '\n'.join(x[~x.isin(['', 'NaN'])]), axis=1)
print(df)
subject role ID C_MEMO
0 Eng Teacher 123 Eng\nTeacher\n123
1 Math NaN 444 Math\n444
2 Science Dr NaN Science\nDr
答案 2 :(得分:1)
您可以对str.join
使用列表推导:
bad_vals = {'', 'Nan'}
df['C_Memo'] = [', '.join([i for i in row if i not in bad_vals]) for row in df.values]
print(df)
ID role subject C_Memo
0 123 Teacher Eng 123, Teacher, Eng
1 444 Math 444, Math
2 NaN Dr Science Dr, Science
这不一定比pd.DataFrame.apply
差,pd.Series
的开销与迭代每一行的python-docx
对象有关。