簡體   English   中英

根據其他列中給出的值在 pandas dataframe 上生成 n 數量新行

[英]Generating n amount new rows on a pandas dataframe based off values given in other columns

因此,我有以下示例 dataframe (為了清晰/簡單起見,僅包含一行):

df = pd.DataFrame({'base_number': [2],
                   'std_dev': [1]})
df['amount_needed'] = 5
df['upper_bound'] = df['base_number'] + df['std_dev']
df['lower_bound'] = df['base_number'] - df['std_dev']

對於每個給定的行,我想生成行數,使得每行的總數是df['amount_needed']給出的數字(在本例中為 5)。 我希望這 5 個新行分布在df['upper_bound']df['lower_bound']給出的頻譜中。 因此,對於上面的示例,我希望得到以下結果作為 output:

df_new = pd.DataFrame({'base_number': [1, 1.5, 2, 2.5, 3]})

當然,這個過程將針對更大的 dataframe 中的所有行完成,以及與這個特定問題無關的許多其他列,這就是為什么我試圖找到一種方法來自動化這個過程。

一行df將創建一個系列(或一個數據框)。 這是迭代df並使用您指定的值創建系列的一種方法:

for row in df.itertuples():
    arr = np.linspace(row.lower_bound, 
                      row.upper_bound, 
                      row.amount_needed)
    s = pd.Series(arr).rename('base_number')
    
print(s)

0    1.0
1    1.5
2    2.0
3    2.5
4    3.0
Name: base_number, dtype: float64

最終使用 jsmart 的貢獻並對其進行處理以生成新的 dataframe,保留原始 id 以便根據需要根據 id 將舊列中的其他列合並到新列中(整個過程如下所示):

amount_needed = 5
df = pd.DataFrame({'base_number': [2, 4, 8, 0],

                   'std_dev': [1, 2, 3, 0]})
df['amount_needed'] = amount_needed
df['upper_bound'] = df['base_number'] + df['std_dev']
df['lower_bound'] = df['base_number'] - df['std_dev']

s1 = pd.Series([],dtype = int)
for row in df.itertuples():
    arr = np.linspace(row.lower_bound, 
                      row.upper_bound, 
                      row.amount_needed)
    s = pd.Series(arr).rename('base_number')
    s1 = pd.concat([s1, s])
  
df_new = pd.DataFrame({'base_number': s1})

ids_og = list(range(1, len(df) + 1))
ids_og = [ids_og] * amount_needed
ids_og = sorted(list(itertools.chain.from_iterable(ids_og)))

df_new['id'] = ids_og

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM