【问题标题】:Add column to a specific CSV row using Python pandas使用 Python pandas 将列添加到特定的 CSV 行
【发布时间】:2014-03-10 18:10:01
【问题描述】:

我想通过将 id 与给定字典匹配来合并 csv 文件中的行。

我有一本字典: l= {2.80215: [376570], 0.79577: [378053], 22667183: [269499]}

我有一个 csv 文件。

          A        B        C        D      
2000-01-03 -0.59885 -0.18141 -0.68828 -0.77572
2000-01-04  0.83935  0.15993  0.95911 -1.12959
2000-01-05  2.80215 -0.10858 -1.62114 -0.20170
2000-01-06  0.71670 -0.26707  1.36029  1.74254
2000-01-07 -0.45749  0.22750  0.46291 -0.58431
2000-01-10 -0.78702  0.44006 -0.36881 -0.13884
2000-01-11  0.79577 -0.09198  0.14119  0.02668
2000-01-12 -0.32297  0.62332  1.93595  0.78024
2000-01-13  1.74683 -1.57738 -0.02134  0.11596

输出应该是:

     A        B        C        D          E      F     
2000-01-03 -0.59885 -0.18141 -0.68828 -0.77572    0
2000-01-04  0.83935  0.15993  0.95911 -1.12959    0
2000-01-05  2.80215 -0.10858 -1.62114 -0.20170    376570 
2000-01-06  0.71670 -0.26707  1.36029  1.74254    0
2000-01-07 -0.45749  0.22750  0.46291 -0.58431    0
2000-01-10 -0.78702  0.44006 -0.36881 -0.13884    0
2000-01-11  0.79577 -0.09198  0.14119  0.02668    378053
2000-01-12 -0.32297  0.62332  1.93595  0.78024    0
2000-01-13  1.74683 -1.57738 -0.02134  0.11596    0 

我试着这样做:

import pandas
data = panda.read_csv("thisfiel.csv")

data["F"] = data["B"].apply(lambda x: l[x])

但我无法获得预期的结果。

【问题讨论】:

  • 我认为安迪的回答是正确的方法,但是你不应该创建一个将其值存储为列表的字典,除非你碰巧有超过 1 个条目的值

标签: python csv pandas


【解决方案1】:

如果你是一个 DataFrame 你可以做一个merge:

In [11]: l_df = pd.DataFrame.from_dict(l, orient='index')

In [12]: l_df.columns = ['F']

In [13]: l_df
Out[13]: 
                     F
2.80215         376570
0.79577         378053
22667183.00000  269499

合并A列和l_df的索引:

In [14]: merged = df.merge(l_df, left_on='A', right_index=True, how='left')

In [15]: merged
Out[15]: 
                  A        B        C        D       F
2000-01-03 -0.59885 -0.18141 -0.68828 -0.77572     NaN
2000-01-04  0.83935  0.15993  0.95911 -1.12959     NaN
2000-01-05  2.80215 -0.10858 -1.62114 -0.20170  376570
2000-01-06  0.71670 -0.26707  1.36029  1.74254     NaN
2000-01-07 -0.45749  0.22750  0.46291 -0.58431     NaN
2000-01-10 -0.78702  0.44006 -0.36881 -0.13884     NaN
2000-01-11  0.79577 -0.09198  0.14119  0.02668  378053
2000-01-12 -0.32297  0.62332  1.93595  0.78024     NaN
2000-01-13  1.74683 -1.57738 -0.02134  0.11596     NaN

注意:atm NaN 表示缺失,可以填写fillna

In [16]: merged['F'].fillna(0, inplace=True)

【讨论】:

  • 如果需要匹配A列,如何合并?
  • @user3378649 我不关注..这是匹配列 A 与索引 l_df
  • l1是什么,是l_df
  • @user3378649 啊,是的,我的错。尝试了更好的命名约定,但错过了一个。
【解决方案2】:

这样做:

def getVal(x):
    try:
        return l[x][0]

    except KeyError:
        return 0

data['F'] = data['B'].map(getVal)

【讨论】:

  • 没用!我仍然在新列中得到零
  • @user3378649 你想要零还是 NaN?您可以将get(x,0) 更改为get(x,NaN)
  • 有线!我在所有新列中都得到值“1”
  • 从字面上看,我应该匹配:B.value,如果 (B.Value == l.item() ),我应该将 dict 中的项目插入到我们在列中找到值的同一行中B.
  • 我认为问题在于 l 是一个带有列表值的字典。
猜你喜欢
  • 1970-01-01
  • 2018-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-31
  • 1970-01-01
  • 2017-06-10
  • 1970-01-01
相关资源
最近更新 更多