输入:
DF1:
name, message
adam, hello, i'am
viola, hi, my name is
data:
name, message
adam, hello, i'am
viola, hi, my name
我想比较一下,如果特定名称(例如adam和adam)的消息长度相同,则打印此行。
代码:
if df['message'].apply(lambda x: len(x)) == data['name'].apply(lambda x: len(x)):
pass
else:
df['message'].apply(lambda x: print(x))
#edit: i can use maybe df.loc[:,'message'] as well i think
但是我收到:
TypeError: object of type 'float' has no len()
,为什么?
答案 0 :(得分:2)
也许有更好的方法,但这可能对您有用:
import pandas
dt = pandas.DataFrame([["Adam","Hello, I am Adam"], ["Viola", "How are you"]], columns=["name", "message"])
data = pandas.DataFrame([["Adam","Hello, I am Adam"], ["Viola", "How are ya"]], columns=["name", "message"])
print(dt)
print(data)
data.columns = ["name", "message_data"]
merged = dt.merge(data, on=["name"])
merged[merged.message.str.len() != merged.message_data.str.len()]
首先,您需要重命名["message"]
列,以使其在合并中不会发生冲突。然后,您合并两个数据框,仅保留两个数据框中都存在的名称。最后,您将["message"]
中的字符串长度与["message_data"]
中的字符串长度进行比较,并使用它们来提取合并表中不同的行。
如果您只想要该消息,则可以执行以下操作:
merged.loc[merged.message.str.len() != merged.message_data.str.len(), "message"]
逐行打印结果应该很简单。
答案 1 :(得分:2)
更好的方法是根据名称合并两个数据框。
import pandas as pd
#construct df1
#construct df2
#merge two df based on name
df=pd.merge(df1,df2,on="name")
#get the length of messages and filter out unequal length
df_same_length=df[~df["message_x"].astype(str).str.len()==df["message_y"].astype(str).str.len()]
print(df_same_length["name"])