我有一个使用此函数创建 CSV 的 DataFrame:
def create_data(date, place, value):
can_spend = 190
try:
file = open(filename, 'r+')
data_set = pd.read_csv(filename, index_col=False)
frame = pd.DataFrame(data_set, columns=['Left', 'Date', 'Place', 'Spent'])
frame = frame.append({"Left": can_spend, "Date": date, "Place": place, "Spent": value}, ignore_index=True)
frame['Date'] = pd.to_datetime(frame['Date'])
frame['Week'] = frame['Date'].dt.weekofyear
# write the data-set to the csv
frame.to_csv(filename, index=None, header=True)
except IOError:
file = open(filename, "w")
frame = pd.DataFrame(columns=['Left', 'Date', 'Place', 'Spent'])
frame.to_csv(filename, index=None, header=True)
这个 DataFrame 将存储我个人预算的一小部分。我有一个设定的支出限额,我希望框架中的每个条目都根据一周从中减去(支出限额将每周重置)。
以下是我向 DataFrame 添加数据的方法:
def create_new_entry(self):
get_date = input("Date: ")
get_place = input("Place: ")
get_amount = float(input("Amount: "))
create_data(get_date, get_place, get_amount)
这是我希望 DataFrame 的外观:
"Left" column will default to the value of 190 each week
Left Date Place Spent Week
0 146.69 2019-01-02 Walmart 43.31 1
1 92.46 2019-01-05 Kroger 54.23 1
2 72.46 2019-01-06 Kroger 20.00 1
# Here is where "Left" will reset on new week
3 170.00 2019-01-08 Kroger 20.00 2
我怎样才能做到这一点?
最佳答案
这可以通过 groupby 来完成和 cumsum用一行代码。不要添加'Left'
读取和创建数据框时的列(我的意思是,你可以,但无论如何它都会被覆盖)。
假设在阅读并首次操作后创建有用的 'Week'
专栏,您的df
是:
Date Place Spent Week
0 2019-01-02 Walmart 43.31 1
1 2019-01-05 Kroger 54.23 1
2 2019-01-06 Kroger 20.00 1
3 2019-01-08 Walmart 20.00 2
4 2019-01-09 Walmart 30.00 2
5 2019-01-10 Kroger 10.00 2
然后您可以创建'Left'
列如:
can_spend = 190
df['Left'] = df.groupby('Week').apply(lambda x : can_spend - x['Spent'].cumsum()).reset_index(drop=True)
和df
将变成:
Date Place Spent Week Left
0 2019-01-02 Walmart 43.31 1 146.69
1 2019-01-05 Kroger 54.23 1 92.46
2 2019-01-06 Kroger 20.00 1 72.46
3 2019-01-08 Walmart 20.00 2 170.00
4 2019-01-09 Walmart 30.00 2 140.00
5 2019-01-10 Kroger 10.00 2 130.00
简单说明:groupby
创建数据框的子集,对列 'Week'
中具有相同值的行进行分组。 apply
方法进行矢量化计算以获得每个子集(周)的剩余金额。 reset_index(drop=True)
否则需要 groupby
构建的索引将与 df
的索引不匹配,引发错误。
关于python - 如何为其他列与 Pandas 交互的特定列设置默认值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57793103/