Roy*_*Han 2 python dataframe pandas
我有一个大约为(1200,10)的大型数据帧,大部分是字符串,我必须在现有引用列说'Y'的基础上附加一个新列说'Z',其值是'A','B','C或未知(NaN或其他),因此我需要在df中选择三个对应的列之一,例如“ D”,“ E”,“ F”,或输出NaN并将此值附加为列“ Z”。我目前有以下代码:
df = pd.DataFrame({'T': {0: '.', 1: '.', 2: '.', 3: '.'},
'G': {0: '.', 1: '.', 2: '.', 3: '.'},
'D': {0: 4, 1: 1, 2: 5, 3: 3},
'E': {0: 6, 1: 2, 2: 7, 3: 2},
'F': {0: 8, 1: 3, 2: 9, 3: 1},
'K': {0: '.', 1: '.', 2: '.', 3:'.'},
'Y': {0: 'A', 1: 'B', 2: 'B', 3: np.nan}})
d = {'A': 'D', 'B': 'E', 'C': 'F'}
df['Z'] = df.lookup(df.index, df.Y.map(d))
Run Code Online (Sandbox Code Playgroud)
问题在于,在Y为未知值的地方查找会失败。在特定的代码中,Y.unique()会出现类似(A,B,C,NaN,nan)的内容。所以我想知道是否有一种方法可以使用查找式方法将Z输出到NaN,其中Y是NaN或给定字典之外的未知数?
T G D E F K Y Z
0 . . 4 6 8 . A 4.0
1 . . 1 2 3 . B 2.0
2 . . 5 7 9 . B 7.0
3 . . 3 2 1 . NaN NaN
Run Code Online (Sandbox Code Playgroud)
您可以将zip stack和reindexzip用于多索引:
df['Z'] = df.stack().reindex(zip(df.index, df.Y.map(d))).reset_index(level=1, drop=True)
Run Code Online (Sandbox Code Playgroud)
输出:
T G D E F K Y Z
0 . . 4 6 8 . A 4
1 . . 1 2 3 . B 2
2 . . 5 7 9 . B 7
3 . . 3 2 1 . NaN NaN
Run Code Online (Sandbox Code Playgroud)
细节:
首先,让我们使用stack,将列标题移到数据框的行索引中,为数据框创建一个多索引。其中,级别0是原始行索引,级别1是列标题。
现在,我们可以reindex用来仅过滤所需的那些索引。使用元组标识多索引。(level0,level1)因此,我们zipdf.index和df.y.map(d)一起创建了reindex使用的元组。
最后,我们删除multiindex的level = 1,以创建原始索引的结构,并为这些列分配一个新值。
| 归档时间: |
|
| 查看次数: |
43 次 |
| 最近记录: |