python - 如何为其他列与 Pandas 交互的特定列设置默认值?

标签 python python-3.x database pandas

我有一个使用此函数创建 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/

相关文章:

python - SQLite、SQLAlchemy

python - 使用来自不同数据集的组均值填充一个数据集中的缺失值

python - BeautifulSoup 搜索属性-值

mysql - NodeJs Mysql - 使用对象传递 SQL 函数(NOW())

python - 分组,计数和计算 Pandas 的比例?

python - 如何删除列中的特殊字符并将列转换为 float ?

Python: "FOR"循环打印基于行的列字段匹配

python - 子进程打开超时实时输出

php - 为什么会出现这些php session_start()错误?

database - (有时)在日期时间中存储 "date only"的麻烦