【问题标题】:Python pandas filling of a DataFrame填充 DataFrame 的 Python 熊猫
【发布时间】:2020-08-31 02:43:37
【问题描述】:

我在填充数据框时遇到问题。 这是初始情况(图1)

我的代码是这样运行的(图 2):

但我想要这个(图 3):

因此,如果从 -1 到 4 的行为空,则它应该为空。但如果有数字则应填写“0”

我的代码看起来像这样...

import pandas as pd
df = pd.read_csv('/Users/Hanna/Code/ZERO.csv')


indx = df[df['D'] == -1].index.values

for i, j in zip(indx[:-1], indx[1:]):
df.loc[i:j-1, 'E'] = df.loc[i:j-1, 'E'].fillna(0)

    if j == indx[-1]:
    df.loc[j:, 'E'] = df.loc[j:, 'E'].fillna(0)

那是我的代码,但我不确定'NaN'

d = { 'A':[4000074,4000074,4000074,4000074,4000074,4000074,4000074,4000074,4000074,4000074,4000074,4000074,4000074,4000074,4000074,4000074,4000074,4000074],“B “:[SP000796746,SP000796746,SP000796746,SP000796746,SP000796746,SP000796746,SP000796746,SP000796746,SP000796746,SP000796746,SP000796746,SP000796746,SP000796746,SP000796746,SP000796746,SP000796746,SP000796746,SP000796746], 'C':[-1,0, 1, 2, 3, 4, -1, 0, 1, 2, 3, 4, -1, 0, 1, 2, 3, 4, -1, 0, 1, 2, 3, 4], 'D ': [0, 1000, 1000, 0, 0, 0, 'NaN', 'NaN', 'NaN', 'NaN', 'NaN', 'NaN', 0, 0, 0, 3000, 3000, 0 ], 'E': [2000, 2000, 2000, 2000, 2000, 2000, 'NaN', 'NaN', 'NaN', 'NaN', 'NaN', 'NaN', 4000, 4000, 4000, 4000 , 4000, 4000]}

谢谢你,汉娜

也许它不起作用,因为我以前这样做过,另一列 F:

indx = df[df['Diff Load Due Week'] == -1].index.values


for i, j in zip(indx[:-1], indx[1:]):
    df.loc[i:j-1, 'F'] = df.loc[i:j-1, 'F'].max()

if j == indx[-1]:
        df.loc[j:, 'F'] = df.loc[j:, 'F'].max()

可以,我必须先删除索引吗?

这是我最后的输出:

base_list =[-1,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26]
df_c = pd.MultiIndex.from_product([
[4000074],
["SP000796746","SP001811642"],
[201824, 201828, 201832, 201835, 201837, 201839, 201845, 201850, 201910, 201918, 201922, 201926, 201909, 201916, 201918, 201920],
base_list],

    names=["A", "B", "C", "D"]).to_frame(index=False)

# Verbinden der neuen Liste und der kleinen Rohdatenliste

df_3 = pd.merge(df_c, df_1, how='outer')

# Zusammengefügte Daten in Excel und csv speichern für Überprüfung und Weiterarbeit

df_3.to_csv('GROß.csv')
df_3.to_excel('GROß.xlsx')

Einlesen der neu erstellten csv

df = pd.read_csv('/Users/Hanna/Desktop/Daten Projektseminar/Coding/GROß.csv')

#Index setzen für -1, damit Spalten und Reihen aufgefüllt werden können

indx = df[df['D'] == -1].index.values

#Aufüllen der Billings mit maximalen Wert

for i, j in zip(indx[:-1], indx[1:]):
    df.loc[i:j-1, 'F'] = df.loc[i:j-1, 'F'].max()

if j == indx[-1]:
        df.loc[j:, 'F'] = df.loc[j:, 'F'].max()

【问题讨论】:

  • 请将您的数据以文本而非图片的形式提供。
  • 你好,请问怎么用excel做呢?
  • 请提供可重复的数据样本
  • 您的数据在 pandas 数据框中,只需执行 print(df) 并将其复制并粘贴到问题中。
  • 我添加了一个列表,希望它适用于这个

标签: python pandas dataframe


【解决方案1】:

好的,现在应该可以解决问题了:

import pandas as pd
import numpy as np

#your data
d = {'A': [4000074, 4000074, 4000074, 4000074, 4000074, 4000074, 4000074, 4000074, 4000074,
   4000074, 4000074, 4000074, 4000074, 4000074, 4000074, 4000074, 4000074, 4000074],
 'B': ['SP000796746', 'SP000796746', 'SP000796746', 'SP000796746', 'SP000796746', 'SP000796746',
   'SP000796746', 'SP000796746', 'SP000796746', 'SP000796746', 'SP000796746', 'SP000796746', 
   'SP000796746', 'SP000796746', 'SP000796746', 'SP000796746', 'SP000796746', 'SP000796746'],
 'C': [201926, 201926, 201926, 201926, 201926, 201926, 201909,201909, 201909, 201909, 201909, 
   201909, 201933, 201933, 201933, 201933, 201933, 201933],
 'D': [-1, 0, 1, 2, 3, 4, -1, 0, 1, 2, 3, 4, -1, 0, 1, 2, 3, 4], 
 'E': [np.nan, 1000, 1000, 0, 0, 0, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, 3000, 3000, np.nan]}

#create data frame
df = pd.DataFrame(data = d)

#group sum column E by ID columns
groupedSum = df.groupby(['A', 'B', 'C'])['E'].sum().reset_index()

#loop over unique IDs
for i, row in groupedSum.iterrows():
    #define values
    idValue = groupedSum.at[i,'C']
    sumValue = groupedSum.at[i,'E']
    #if sum is not zero
    if (sumValue != 0):
        #change values to zero if greater than zero
        df['E'].loc[df['C'] == idValue] = df['E'].apply(lambda x: x if x > 0 else 0)

print(df)

          A            B       C  D       E
0   4000074  SP000796746  201926 -1     0.0
1   4000074  SP000796746  201926  0  1000.0
2   4000074  SP000796746  201926  1  1000.0
3   4000074  SP000796746  201926  2     0.0
4   4000074  SP000796746  201926  3     0.0
5   4000074  SP000796746  201926  4     0.0
6   4000074  SP000796746  201909 -1     NaN
7   4000074  SP000796746  201909  0     NaN
8   4000074  SP000796746  201909  1     NaN
9   4000074  SP000796746  201909  2     NaN
10  4000074  SP000796746  201909  3     NaN
11  4000074  SP000796746  201909  4     NaN
12  4000074  SP000796746  201933 -1     0.0
13  4000074  SP000796746  201933  0     0.0
14  4000074  SP000796746  201933  1     0.0
15  4000074  SP000796746  201933  2  3000.0
16  4000074  SP000796746  201933  3  3000.0
17  4000074  SP000796746  201933  4     0.0

【讨论】:

  • 感谢您非常详细的解释,不幸的是我不是母语人士,所以我很难正确解释。不幸的是,您的解决方案还没有帮助我。不幸的是,我必须上传一张图片以便更好地理解。如果列“E”中有一个值,例如“1000”,那么从 -1 到 4,这个数字周围的部分应该用 0 填充。如第三张图片所示。如果 -1 到 4 之间没有值,则不应填写任何内容,因此也不应填写“0”。这也显示在图 3 中
  • 上面我上传了一张图片以便更好理解(图1)
  • 好的,我刚刚更新了答案来做你想做的事!
  • 是的,它几乎像想要的那样工作。非常感谢。唯一不起作用的是这个 ['A', 'B', 'C'] 但我尝试解决它
  • 我第一次粘贴答案时有一个错字,但确实再次编辑它,所以你可能已经复制了它,但仍然存在,如果仍然没有,请使用上面的更新代码再试一次' t 工作,让我知道您收到什么错误消息。最后,如果它对你有用,请接受其他路过的人的答案!
猜你喜欢
  • 2020-11-06
  • 2019-07-12
  • 1970-01-01
  • 1970-01-01
  • 2017-08-04
  • 2015-10-06
  • 2021-03-18
  • 2021-12-29
  • 1970-01-01
相关资源
最近更新 更多