【问题标题】:How a list can enter into a python dataframe's cell?列表如何进入 python 数据框单元格?
【发布时间】:2021-12-21 01:05:10
【问题描述】:

我有一些数据帧(df、tmp_df 和 final_df),我想将两列 tmp_df 作为列表类型输入到 final_df 的两个不同单元格中。我的代码和数据框如下所示。但是,循环部分无法正常工作。 stackoverflow 或其他网站中的其他问题,如果从程序开头有可用的列表字典,请回答此问题。但是在这里, tmp_df 数据帧在 for 循环期间发生变化,并且在每次迭代中都会计算出合适的价格。此外,建立了最相关的数据,它们必须定位为 final_df 的相关单元格。

    import pandas as pd

    df = pd.read_csv('myfile.csv')
    tmp_df = pd.DataFrame()
    final_df = pd.DataFrame()
    tmp_df = df[df['Type'] == True]
    cnt = 0
    for c in tmp_df['Category']:
        #################
        # Apply some calculations and call different methods to do some changes on Price column of tmp_df.
        #################
        final_df.at[cnt,'Data'] = list(set(tmp_sub['Data']))
        final_df ['Category'], final_df['Acceptable'], final_df['Rank'],final_df['Price'] = \
        tmp_df['Rank'], list(tmp_sub['Price'])
        cnt +=1



df:

| Data    | Category | Acceptable | Rank | Price |
| ------- | -------- | ---------- | ---- | ----- |
| 30275   | A        | Yes        |  1   | 52787 |
| 35881   | C        | No         |  2   | 14804 |
| 28129   | C        | Yes        |  3   | 180543|
| 30274   | D        | No         |  2   | 8066  |
| 30351   | D        | Yes        |  3   | 273478|
| 35886   | A        | Yes        |  2   | 10808 |
| 39900   | C        | Yes        |  1   | 21893 |
| 35887   | A        | No         |  2   | 2244  |
| 35883   | A        | Yes        |  1   | 10066 |
| 35856   | D        | Yes        |  3   | 19011 |
| 35986   | C        | No         |  2   | 6895  |
| 30350   | D        | No         |  3   | 5243  |
| 28129   | C        | Yes        |  1   | 112859|
| 31571   | C        | Yes        |  1   | 20701 |

tmp_df:

| Data    | Category | Acceptable | Rank | Price |
| ------- | -------- | ---------- | ---- | ----- |
| 30275   | A        | Yes        |  1   | 52787 |
| 38129   | C        | Yes        |  3   | 180543|
| 30351   | D        | Yes        |  3   | 273478|
| 35886   | A        | Yes        |  2   | 10808 |
| 39900   | C        | Yes        |  1   | 21893 |
| 35883   | A        | Yes        |  1   | 10066 |
| 35856   | D        | Yes        |  3   | 19011 |
| 28129   | C        | Yes        |  1   | 112859|
| 31571   | C        | Yes        |  1   | 20701 |

The prices in the final dataframe (final_df) are changed because of the calculations over the tmp_df. Now, what should I do if I want the following result?

final_df:

| Data                      | Category | Acceptable | Rank | Price |
| -------                   | -------- | ---------- | ---- | ----- |
| [30275,35886,35883]       | A        | Yes        | [1,2]| 195543|
| [28129,39900,38129,31571] | C        | Yes        | [1,3]| 210089|
| [30351,35856]             | D        | Yes        |   3  | 113859|

【问题讨论】:

  • 计数Price栏目怎么样?

标签: pandas list dataframe


【解决方案1】:

您可以聚合 listPrice 另一个聚合函数,例如summean...:

#generate custom function for Price
def func(x):
    
    return x.sum()

d = {'Data':list,'Rank':lambda x: list(set(x)), 'Price':func}
final_df = (tmp_df.groupby(['Category','Acceptable'],as_index=False)
                  .agg(d)
                  .reindex(tmp_df.columns, axis=1))

d = {'Data':list,'Rank':lambda x: list(set(x)), 'Price':'max'}
final_df = (tmp_df.groupby(['Category','Acceptable'],as_index=False)
                  .agg(d)
                  .reindex(tmp_df.columns, axis=1))

print (final_df)
                           Data Category Acceptable    Rank   Price
0         [30275, 35886, 35883]        A        Yes  [1, 2]   52787
1  [38129, 39900, 28129, 31571]        C        Yes  [1, 3]  180543
2                [30351, 35856]        D        Yes     [3]  273478

自定义函数的解决方案:

def func1(x):
    return x.sum()


def f(x):

    a = list(x['Data'])
    b = list(set(x['Rank']))
    c = func1(x['Price'])
    
    return pd.Series({'Data':a,'Rank':b,'Price':c})


final_df = (tmp_df.groupby(['Category','Acceptable'])
                  .apply(f)
                  .reset_index()
                  .reindex(tmp_df.columns, axis=1))

【讨论】:

  • 谢谢。但正如您所见,价格列不仅由summean 提供。我在不同的情况下使用了几个函数。所以,我不能在这里使用聚合函数。有没有其他方法可以做到这一点?
  • 此数据框还有其他列,但我没有使用它们,因为问题会很拥挤。我也对其他列应用了不同的更改。我只想将DataRank 的列表添加到每一行的相关单元格中。
  • @V.Nouri - 首先不要使用循环,这里没有必要。那么I have used a couple of functions for different situation 是什么意思呢?你能说得更具体点吗?
  • @V.Nouri - I have applied different changes to the other columns as well. 所以这意味着在函数f 或字典d 中定义它,需要正在处理的每一列。
  • @V.Nouri - 答案已编辑。您可以在另一个函数中调用函数。
猜你喜欢
  • 2020-08-15
  • 2019-11-15
  • 1970-01-01
  • 2020-12-04
  • 2018-05-16
  • 2021-12-20
  • 2018-09-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多