我有两个数据帧作为流程:
leader:
0 11
1 8
2 5
3 9
4 8
5 6
[6065 rows x 2 columns]
DatasetLabel:
Unnamed: 0 0 1 .... 7 8 9 10 11 12
0 A J .... 1 2 5 NaN NaN NaN
1 B K .... 3 4 NaN NaN NaN NaN
[4095 rows x 14 columns]
信息数据集列名0到6是关于数据的DatasetLabel,7到12是引用引导数据帧的第一列的索引。
我想创建数据集,而不是DatasetLabel数据集中的索引,我有领导数据集中每个索引的值leader.iloc[index,1]
如何使用python功能进行操作?
输出应如下所示:
DatasetLabel:
Unnamed: 0 0 1 .... 7 8 9 10 11 12
0 A J .... 8 5 6 NaN NaN NaN
1 B K .... 9 8 NaN NaN NaN NaN
我想出了以下内容,但我收到了错误:
for column in DatasetLabel.ix[:,8:13]:
DatasetLabel[DatasetLabel[column].notnull ()]=leader.iloc[DatasetLabel[DatasetLabel[column].notnull ()][column].values,1]
错误:
ValueError: Must have equal len keys and value when setting with an iterable
答案 0 :(得分:4)
您可以使用apply
索引到leader
并与DatasetLabel
交换价值,虽然它不是很漂亮。
一个问题是Pandas不会让我们用NaN
索引。转换为str
可提供解决方法。但这会产生第二个问题,即列9
的类型为float
(因为NaN
为float
),因此5
变为5.0
。一旦它是一个字符串,那就是"5.0"
,它将无法匹配leader
中的索引值。我们可以删除.0
,然后这个解决方案就可以了 - 但这有点像黑客。
DatasetLabel
为:
Unnamed:0 0 1 7 8 9 10 11 12
0 0 A J 1 2 5.0 NaN NaN NaN
1 1 B K 3 4 NaN NaN NaN NaN
并且leader
为:
0 1
0 0 11
1 1 8
2 2 5
3 3 9
4 4 8
5 5 6
然后:
cols = ["7","8","9","10","11","12"]
updated = DatasetLabel[cols].apply(
lambda x: leader.loc[x.astype(str).str.split(".").str[0], 1].values, axis=1)
updated
7 8 9 10 11 12
0 8.0 5.0 6.0 NaN NaN NaN
1 9.0 8.0 NaN NaN NaN NaN
现在我们可以concat
使用original
updated
未经修改的列(我们称之为original_cols = DatasetLabel.columns[~DatasetLabel.columns.isin(cols)]
original = DatasetLabel[original_cols]
pd.concat([original, updated], axis=1)
):
Unnamed:0 0 1 7 8 9 10 11 12
0 0 A J 8.0 5.0 6.0 NaN NaN NaN
1 1 B K 9.0 8.0 NaN NaN NaN NaN
输出:
concat
注意:在此处使用original
可能更为清晰,但这是使用updated
合并assign
和DatasetLabel.assign(**updated)
的另一种更清洁的方式:
*