应用动态列数

时间:2015-03-28 04:47:03

标签: python pandas

我有一个pandas数据帧,我想让最后N列为空值。 N取决于另一列中的值。

以下是一个例子:

df = pd.DataFrame(np.random.randn(4, 5))
df['lookup_key'] = df.index     #(actual data does not use index here)
lkup_dict = {0:1,1:2,2:2,3:3}

在这个DataFrame中,我想使用' lookup_key'中的值。列,用于确定要设置为null的列。

Row 0 -> df.ix[0,lkup_dict[0]:4] = np.nan       #key = 0, value = 1
Row 1 -> df.ix[1,lkup_dict[1]:4] = np.nan       #key = 1, value = 2
Row 2 -> df.ix[2,lkup_dict[2]:4] = np.nan       #key = 2, value = 2
Row 3 -> df.ix[3,lkup_dict[3]:4] = np.nan       #key = 3, value = 3

最终结果如下:

      0         1         2   3   4  lookup_key
0 -0.882864       NaN       NaN NaN NaN           0
1  1.358663 -0.024898       NaN NaN NaN           1
2  0.885058  0.673621       NaN NaN NaN           2
3 -1.487506  0.031021 -1.313646 NaN NaN           3

在这个例子中,我必须为每一行手动输入df.ix ....我需要一些能够为我的DataFrame

的所有行执行此操作的内容

1 个答案:

答案 0 :(得分:2)

您可以使用for循环执行此操作。为了演示,我生成了一个带有一些随机值的DataFrame。然后我在前面插入一个lookup_key列,带有一些随机整数。最后,我使用一些随机值生成lkup_dict字典。

>>> import pandas as pd
>>> import numpy as np
>>> 
>>> df = pd.DataFrame(np.random.randn(10, 4), columns=list('ABCD'))
>>> df.insert(0, 'lookup_key', np.random.randint(0, 5, 10))
>>> print df

   lookup_key         A         B         C         D
0           0  0.048738  0.773304 -0.912366 -0.832459
1           3 -0.573221 -1.381395 -0.644223  1.888484
2           0  0.198043 -0.751243  0.138277  2.006188
3           2 -1.692605 -1.586282 -0.656690  0.647510
4           3 -0.847591 -0.368447  0.510250 -0.172055
5           1  0.927243 -0.447478  0.796221  0.372763
6           3  0.027285  0.177276  1.087456 -0.420614
7           4 -1.147004 -0.172367 -0.767347 -0.855318
8           1 -0.649695 -0.572409 -0.664149  0.863050
9           4 -0.820982 -0.499889 -0.624889  1.397271

>>> lkup_dict = {i: np.random.randint(0, 5) for i in range(5)}
>>> print lkup_dict

{0: 3, 1: 0, 2: 0, 3: 4, 4: 1}

现在我遍历DataFrame中的行。 key获取该行的lookup_key列下的值。 nNulls使用密钥从lkup_dict获取空值的数量。 startIndex获取该行中具有空值的第一列的索引。最后一行用空值替换相关值。

>>> for i, row in df.iterrows():
...     key = row['lookup_key'].astype(int)
...     nNulls = lkup_dict[key]
...     startIndex = df.shape[1] - nNulls
...     df.loc[i, startIndex:] = np.nan
>>> print df

   lookup_key         A         B         C         D
0           0  0.048738       NaN       NaN       NaN
1           3       NaN       NaN       NaN       NaN
2           0  0.198043       NaN       NaN       NaN
3           2 -1.692605 -1.586282 -0.656690  0.647510
4           3       NaN       NaN       NaN       NaN
5           1  0.927243 -0.447478  0.796221  0.372763
6           3       NaN       NaN       NaN       NaN
7           4 -1.147004 -0.172367 -0.767347       NaN
8           1 -0.649695 -0.572409 -0.664149  0.863050
9           4 -0.820982 -0.499889 -0.624889       NaN

那就是它。希望这是你正在寻找的东西。