Расширить столбец панд без слияния - PullRequest
0 голосов
/ 01 ноября 2018

Предположим, у меня есть такой фрейм данных для панд:

    A   B   C
0   2  19  12
1   5  17  13
2   6  16  19
3   7  11  16
4  10   1  11

И я хочу, чтобы это расширилось в столбце A следующим образом:

    A     B     C
0   2  19.0  12.0
1   3   NaN   NaN
2   4   NaN   NaN
3   5  17.0  13.0
4   6  16.0  19.0
5   7  11.0  16.0
6   8   NaN   NaN
7   9   NaN   NaN
8  10   1.0  11.0

Вот как я это делаю в настоящее время, создавая массив numpy, который содержит список плотных целых чисел, а затем merge это с DataFrame, это создает кадр данных, показанный выше:

new_arr = np.arange(df.iloc[0,0], df.iloc[-1,0]+1)
new_col = pd.Series(new_arr).to_frame()
new_col.columns = ['A']
new_df = pd.merge(new_col, df, on='A', how='left')

Но я чувствую, что должен быть лучший способ непосредственного использования серии для расширения кадра данных без использования merge или даже встроенной функции панды в исходном кадре данных? Спасибо за любое решение.

Вот первый df для более легкой репликации:

pd.DataFrame([[2, 19, 12], [5, 17, 13], [6, 16, 19], [7, 11, 16], [10, 1, 11]], columns=['A', 'B', 'C'])

Ответы [ 2 ]

0 голосов
/ 01 ноября 2018

Опция с использованием генераторов

def f(df):
  a = df.A.min()
  n, m = df.shape
  nans = tuple(np.nan for _ in range(m - 1))

  for t in zip(*map(df.get, df)):
    while a < t[0]:
      yield (a,) + nans
      a += 1
    yield t
    a += 1

pd.DataFrame([*f(df)], columns=df.columns)

    A     B     C
0   2  19.0  12.0
1   3   NaN   NaN
2   4   NaN   NaN
3   5  17.0  13.0
4   6  16.0  19.0
5   7  11.0  16.0
6   8   NaN   NaN
7   9   NaN   NaN
8  10   1.0  11.0
0 голосов
/ 01 ноября 2018

Вы можете использовать reindex после установки A в качестве индекса:

>>> df.set_index('A').reindex(range(df.A.min(),df.A.max()+1)).reset_index()
    A     B     C
0   2  19.0  12.0
1   3   NaN   NaN
2   4   NaN   NaN
3   5  17.0  13.0
4   6  16.0  19.0
5   7  11.0  16.0
6   8   NaN   NaN
7   9   NaN   NaN
8  10   1.0  11.0

Обратите внимание, вы также можете использовать np.arange и iloc, которые у вас есть в вашем вопросе, вместо range:

df.set_index('A').reindex(np.arange(df.iloc[0,0], df.iloc[-1,0]+1)).reset_index()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...