我是新手使用Pandas,我目前正在尝试清理其中一个数据帧,因此我可以根据共享ID合并/加入另一个数据帧。问题是我的一个数据帧有多个ID列,可能都包含ID列表,所有这些列都是有效的。
我试图将每个ID放在一个唯一的行行上,以使合并过程更容易。以下是我的数据:
dataFixed = pd.DataFrame({"Name":["Bob", "Bob", "Bob","Mary","Mary","Mary"], "Age":[50,50,50,55,55,55],"ID":["1,2","3","4","5","6"]})
Age ID Name
0 50 1 Bob
1 50 2 Bob
2 50 3 Bob
3 55 4 Mary
4 55 5 Mary
5 55 6 Mary
这就是我想要的输出(除非有一种更简单的方法来设置此数据帧以便与基于ID的另一个数据帧合并)。
data["ID1"] = data["ID1"].str.split(",")
data["ID2"] = data["ID2"].str.split(",")
data["ID"] = data[["ID1", "ID2"]].apply(lambda x: ",".join(sorted(set(x), key=str)))
我最初的想法是将每个ID字符串组合成ID列表而不是逗号分隔字符串,并创建一组ID作为单个列作为我的起点。但是我甚至无法达到这一点,因为我得到了一个不可用的类型:' list'""错误。这是我最初努力的一些代码:
ZnCharacterReadStream
答案 0 :(得分:0)
IIUC,字符串取消
data=data.fillna('')
data['ID']=data.ID1.str.split(',')+data.ID2.str.split(',')
data.set_index(['Age','Name']).ID.apply(pd.Series).replace('',np.nan).stack().drop_duplicates().reset_index().drop('level_2',1)
Out[560]:
Age Name 0
0 50 Bob 1
1 50 Bob 2
2 50 Bob 3
3 55 Mary 4
4 55 Mary 5
5 55 Mary 6
答案 1 :(得分:0)
这是我的解决方案。很多是从this question.
借来的我遇到的许多解决方案的问题是,在重建新数据帧时,他们需要手动索引其余列。我想避免这种情况,因为我的实际框架比3列长得多。
data[["ID1","ID2"]] = data[["ID1","ID2"]].fillna("")
data["ID"] = data["ID1"] + "," + data["ID2"]
data["ID"] = data["ID"].apply(lambda x: list(filter(None,list(set(x.split(","))))))
data = data.drop(["ID1", "ID2"], axis=1)
rows = []
_ = data.apply(lambda row: [rows.append(row.tolist()[0:-1] + [i])
for i in row.ID], axis=1)
data_fixed = pd.DataFrame(rows, columns=data.columns[0:])