将列标题添加到熊猫数据框..但是即使标题是相同的维度,NAN 也是所有数据

Posted

技术标签:

【中文标题】将列标题添加到熊猫数据框..但是即使标题是相同的维度,NAN 也是所有数据【英文标题】:Adding Column headers to pandas dataframe.. but NAN's all the data even though headers are same dimension 【发布时间】:2016-04-12 01:50:43 【问题描述】:

我正在尝试将列标题添加到已解析为带有 Pandas 的数据框的 csv 文件中。

dfTrades = pd.read_csv('pnl1.txt',delim_whitespace=True,header=None,);
dfTrades = dfTrades.drop(dfTrades.columns[[3,4,6,8,10,11,13,15,17,18,25,27,29,32]], axis=1)     # Note: zero indexed
dfTrades = dfTrades.set_index([dfTrades.index]);
df = pd.DataFrame(dfTrades,columns=['TradeDate',
                                      'TradeTime',
                                      'CumPnL',
                                      'DailyCumPnL',
                                      'RealisedPnL',
                                      'UnRealisedPnL',
                                      'CCYCCY',
                                      'CCYCCYPnLDaily',
                                      'Position',
                                      'CandleOpen',
                                      'CandleHigh',
                                      'CandleLow',
                                      'CandleClose',
                                      'CandleDir',
                                      'CandleDirSwings',
                                      'TradeAmount',
                                      'Rate',
                                      'PnL/Trade',
                                      'Venue',
                                      'OrderType',
                                      'OrderID'
                                      'Code']);


print df

数据的结构是:

01/10/2015 05:47.3  190 190 -648 838 EURNOK -648 0  0 611   -1137   -648 H 2     -1000000   9.465   -648    INTERNAL    IOC 287 AS

Pandas 返回的是:

  TradeDate  TradeTime  CumPnL  DailyCumPnL  RealisedPnL  UnRealisedPnL  \
0            NaN        NaN     NaN          NaN          NaN            NaN   ...

我将不胜感激有关此问题的任何建议。

谢谢

附言。 感谢 Ed 的回答。 我已经尝试过您的建议

df = dfTrades.columns=['TradeDate',
                   'TradeTime',
                   'CumPnL',
                   'DailyCumPnL',
                   'RealisedPnL',
                   'UnRealisedPnL',
                   'CCYCCY',
                   'CCYCCYPnLDaily',
                   'Position',
                   'CandleOpen',
                   'CandleHigh',
                   'CandleLow',
                   'CandleClose',
                   'CandleDir',
                   'CandleDirSwings',
                   'TradeAmount',
                   'Rate',
                   'PnL/Trade',
                   'Venue',
                   'OrderType',
                   'OrderID'
                   'Code'];

但现在问题已经演变为:

 ValueError: Length mismatch: Expected axis has 22 elements, new values have     21 elements

我采用了矩阵的形状并得到: dfTrades.shape

(12056, 22)

很遗憾我仍然需要一些帮助:(

【问题讨论】:

您的最后一个错误很明显,您有 22 列,但您试图传递 21 列名称的列表,不清楚您希望这样做:dfTrades.set_index([dfTrades.index]); 那么是什么解决了您的问题? 嗨 EdChum - 感谢您的帮助。问题已解决,抱歉回来晚了。 【参考方案1】:

在传递给 pandas pd.DataFrame 时,您需要使用 dfTrades.values 而不是 dfTrades

column_names= ['TradeDate',
               'TradeTime',
               'CumPnL',
               'DailyCumPnL',
               'RealisedPnL',
               'UnRealisedPnL',
               'CCYCCY',
               'CCYCCYPnLDaily',
               'Position',
               'CandleOpen',
               'CandleHigh',
               'CandleLow',
               'CandleClose',
               'CandleDir',
               'CandleDirSwings',
               'TradeAmount',
               'Rate',
               'PnL/Trade',
               'Venue',
               'OrderType',
               'OrderID'
               'Code']


df1 = pd.DataFrame(dfTrades.values, columns = column_names )

df1.head()

【讨论】:

【参考方案2】:

你可以试试这样: 您可以直接在read_csv中使用名称

names : 类似数组,默认 None 要使用的列名列表。如果文件 不包含标题行,那么您应该显式传递 header=None

Cov = pd.read_csv("path/to/file.txt", sep='\t', 
                  names = ["Sequence", "Start", "End", "Coverage"])
Frame=pd.DataFrame([Cov], columns = ["Sequence", "Start", "End", "Coverage"])

this 回答。

【讨论】:

【参考方案3】:

直接分配给列:

df.columns = ['TradeDate',
                                      'TradeTime',
                                      'CumPnL',
                                      'DailyCumPnL',
                                      'RealisedPnL',
                                      'UnRealisedPnL',
                                      'CCYCCY',
                                      'CCYCCYPnLDaily',
                                      'Position',
                                      'CandleOpen',
                                      'CandleHigh',
                                      'CandleLow',
                                      'CandleClose',
                                      'CandleDir',
                                      'CandleDirSwings',
                                      'TradeAmount',
                                      'Rate',
                                      'PnL/Trade',
                                      'Venue',
                                      'OrderType',
                                      'OrderID'
                                      'Code']

您正在做的是重新索引,因为列不同意获取所有NaNs,因为您将 df 作为数据传递,它将与现有列名和索引值对齐。

您可以在这里看到相同的语义行为:

In [240]:
df = pd.DataFrame(data= np.random.randn(5,3), columns = np.arange(3))
df

Out[240]:
          0         1         2
0  1.037216  0.761995  0.153047
1 -0.602141 -0.114032 -0.323872
2 -1.188986  0.594895 -0.733236
3  0.556196  0.363965 -0.893846
4  0.547791 -0.378287 -1.171706

In [242]:
df1 = pd.DataFrame(df, columns = list('abc'))
df1

Out[242]:
    a   b   c
0 NaN NaN NaN
1 NaN NaN NaN
2 NaN NaN NaN
3 NaN NaN NaN
4 NaN NaN NaN

或者,您可以将 np 数组作为数据传递:

df = pd.DataFrame(dfTrades.values,columns=['TradeDate',

In [244]:
df1 = pd.DataFrame(df.values, columns = list('abc'))
df1

Out[244]:
          a         b         c
0  1.037216  0.761995  0.153047
1 -0.602141 -0.114032 -0.323872
2 -1.188986  0.594895 -0.733236
3  0.556196  0.363965 -0.893846
4  0.547791 -0.378287 -1.171706

【讨论】:

以上是关于将列标题添加到熊猫数据框..但是即使标题是相同的维度,NAN 也是所有数据的主要内容,如果未能解决你的问题,请参考以下文章

将列添加到熊猫数据框以进行多索引

将列中的所有值复制到熊猫数据框中的新列

熊猫数据框:将列转换为单列的行

将列值分配给熊猫数据框中的唯一行[重复]

将列添加到具有恒定值的数据框

如何为熊猫数据框添加唯一的字母数字 ID?