使用Pandas将两个标识符列表组合到一个列中

时间:2018-03-26 14:29:55

标签: python pandas

我是新手使用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

2 个答案:

答案 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:])