天道酬勤,学无止境

python,pandas,数据框,行到列(python, pandas, dataframe, rows to columns)

问题

我有一个从组织不当的 SQL 表中提取的数据框。 该表对每个通道都有唯一的行,我可以将该信息提取到 python 数据帧,并打算进行进一步处理,但现在只想将其转换为更可用的格式

样本输入:

C = pd.DataFrame()
A = np.array([datetime.datetime(2016,8,8,0,0,1,1000),45,'foo1',1])
B = pd.DataFrame(A.reshape(1,4),columns = ['date','chNum','chNam','value'])
C = C.append(B)
A = np.array([datetime.datetime(2016,8,8,0,0,1,1000),46,'foo2',12.3])
B = pd.DataFrame(A.reshape(1,4),columns = ['date','chNum','chNam','value'])
C = C.append(B)
A = np.array([datetime.datetime(2016,8,8,0,0,2,1000),45,'foo1',10])
B = pd.DataFrame(A.reshape(1,4),columns = ['date','chNum','chNam','value'])
C = C.append(B)
A = np.array([datetime.datetime(2016,8,8,0,0,2,1000),46,'foo2',11.3])
B = pd.DataFrame(A.reshape(1,4),columns = ['date','chNum','chNam','value'])
C = C.append(B)

生产

                             date chNum chNam value
0  2016-08-08 00:00:01.001000    45  foo1     1
0  2016-08-08 00:00:01.001000    46  foo2  12.3
0  2016-08-08 00:00:02.001000    45  foo1    10
0  2016-08-08 00:00:02.001000    46  foo2  11.3

我想要

                                 date foo1     foo2  
2016-08-08 00:00:01.001000           1     12.3
2016-08-08 00:00:02.001000           10   113

我有一个解决方案:制作一个唯一日期列表,为每个日期循环遍历数据框并拉出每个通道,创建一个新行。 有点乏味(容易出错)! 编程,所以我想知道是否有更好的方法来利用 Pandas 工具

回答1

使用set_index然后unstack到支点

C.set_index(['date', 'chNum', 'chNam'])['value'].unstack(['chNam', 'chNum'])


为了得到你所要求的

C.set_index(['date', 'chNam'])['value'].unstack().rename_axis(None, 1)

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • 将函数应用于熊猫数据框的每一行以创建两个新列(Apply function to each row of pandas dataframe to create two new columns)
    问题 我有一个熊猫DataFrame, st包含多个列: <class 'pandas.core.frame.DataFrame'> DatetimeIndex: 53732 entries, 1993-01-07 12:23:58 to 2012-12-02 20:06:23 Data columns: Date(dd-mm-yy)_Time(hh-mm-ss) 53732 non-null values Julian_Day 53732 non-null values AOT_1020 53716 non-null values AOT_870 53732 non-null values AOT_675 53188 non-null values AOT_500 51687 non-null values AOT_440 53727 non-null values AOT_380 51864 non-null values AOT_340 52852 non-null values Water(cm) 51687 non-null values %TripletVar_1020 53710 non-null values %TripletVar_870 53726 non-null values %TripletVar_675 53182 non-null values
  • python pandas数据框:用条件均值填充nans(python pandas dataframe : fill nans with a conditional mean)
    问题 我有以下数据框: import numpy as np import pandas as pd df = pd.DataFrame(data={'Cat' : ['A', 'A', 'A','B', 'B', 'A', 'B'], 'Vals' : [1, 2, 3, 4, 5, np.nan, np.nan]}) Cat Vals 0 A 1 1 A 2 2 A 3 3 B 4 4 B 5 5 A NaN 6 B NaN 我希望索引5和6填充基于“Cat”列的“Vals”的条件平均值,即2和4.5 以下代码工作正常: means = df.groupby('Cat').Vals.mean() for i in df[df.Vals.isnull()].index: df.loc[i, 'Vals'] = means[df.loc[i].Cat] Cat Vals 0 A 1 1 A 2 2 A 3 3 B 4 4 B 5 5 A 2 6 B 4.5 但我正在寻找更好的东西,比如 df.Vals.fillna(df.Vals.mean(Conditionally to column 'Cat')) 编辑:我发现了这一点,它缩短了一行,但我仍然不满意: means = df.groupby('Cat').Vals.mean() df.Vals = df.apply(lambda
  • 如何将此字典列表转换为csv文件?(How do I convert this list of dictionaries to a csv file?)
    问题 我有一个字典列表,看起来像这样: toCSV = [{'name':'bob','age':25,'weight':200},{'name':'jim','age':31,'weight':180}] 我应该怎么做才能将其转换为如下所示的csv文件: name,age,weight bob,25,200 jim,31,180 回答1 import csv toCSV = [{'name':'bob','age':25,'weight':200}, {'name':'jim','age':31,'weight':180}] keys = toCSV[0].keys() with open('people.csv', 'w', newline='') as output_file: dict_writer = csv.DictWriter(output_file, keys) dict_writer.writeheader() dict_writer.writerows(toCSV) 回答2 在python 3中,情况有所不同,但是方式更简单,错误更少。 告诉CSV文件应该使用utf8编码打开是个好主意,因为它会使数据更易于他人移植(假设您未使用像latin1这样的限制性更强的编码) import csv toCSV = [{'name':'bob','age':25
  • 如何根据列值从DataFrame中选择行(How to select rows from a DataFrame based on column values)
    问题 如何基于Pandas中某些列中的值从DataFrame选择行? 在SQL中,我将使用: SELECT * FROM table WHERE colume_name = some_value 我试图查看Pandas的文档,但没有立即找到答案。 回答1 要选择列值等于标量some_value ,请使用== : df.loc[df['column_name'] == some_value] 要选择行其列值是一个迭代, some_values ,使用isin : df.loc[df['column_name'].isin(some_values)] 将多个条件与&组合: df.loc[(df['column_name'] >= A) & (df['column_name'] <= B)] 注意括号。 由于Python的运算符优先级规则, &绑定比<=和>=更紧密。 因此,最后一个示例中的括号是必需的。 没有括号 df['column_name'] >= A & df['column_name'] <= B 被解析为 df['column_name'] >= (A & df['column_name']) <= B 从而导致系列的真值是模棱两可的错误。 要选择列值不等于some_value ,请使用!= : df.loc[df['column_name'] != some_value]
  • 使用Pandas处理可变数量的列-Python(Handling Variable Number of Columns with Pandas - Python)
    问题 我有一个看起来像这样的数据集(最多5列-但可以更少) 1,2,3 1,2,3,4 1,2,3,4,5 1,2 1,2,3,4 .... 我正在尝试使用pandas read_table将其读取到5列数据框中。 我想读这篇,无需额外按摩。 如果我尝试 import pandas as pd my_cols=['A','B','C','D','E'] my_df=pd.read_table(path,sep=',',header=None,names=my_cols) 我收到一个错误-“列名有5个字段,数据有3个字段”。 有什么方法可以让熊猫在读取数据时为缺少的列填写NaN? 回答1 似乎可行的一种方法(至少在0.10.1和0.11.0.dev-fc8de6d中): >>> !cat ragged.csv 1,2,3 1,2,3,4 1,2,3,4,5 1,2 1,2,3,4 >>> my_cols = ["A", "B", "C", "D", "E"] >>> pd.read_csv("ragged.csv", names=my_cols, engine='python') A B C D E 0 1 2 3 NaN NaN 1 1 2 3 4 NaN 2 1 2 3 4 5 3 1 2 NaN NaN NaN 4 1 2 3 4 NaN 注意,这种方法要求您给想要的列命名。
  • python3 Pandas
    import pandas as pd from pandas import Series ,DataFrame import numpy as np from numpy import nan as NaN 一、新建DataFrame的方式 1、 list1 = [{'name':'小明','age':30},{'name':'小花','age':24}] df3 = DataFrame(list1) name age 0 小明 30 1 小花 24 pymongo 读取数据后可以直接转化为DataFrame处理 cursor = db[collection].find(query).limit(10) # Expand the cursor and construct the DataFrame df3 = pd.DataFrame(list(cursor)) 2、通过字典建立 此外可以调用from_开头的类方法 dict2={"a":[1,2,3],"b":[4,5,6]} #默认 a b 为colums 可以通过指定df7=pd.DataFrame.from_dict(dict2,orient="index") a 就变为index df6=pd.DataFrame.from_dict(dict2) a b 0 1 4 1 2 5 2 3 6 #指定索引 df2
  • Python PyTd teradata Query Into Pandas DataFrame(Python PyTd teradata Query Into Pandas DataFrame)
    问题 我正在使用PyTd teradata模块从 Teradata 查询数据并希望将其读入 Pandas DataFrame import teradata import pandas as pd # teradata connection udaExec = teradata.UdaExec(appName="Example", version="1.0", logConsole=False) session = udaExec.connect(method="odbc", system="", username="", password="") # Create empty dataframe with column names query = session.execute("SELECT TOP 1 * FROM table") cols = [str(d[0]) for d in query.description] df = pd.DataFrame(columns=cols) # Read data into dataframe for row in session.execute("SELECT * FROM table"): print type(row) df.append(row) row属于teradata.util.Row class ,不能附加到数据帧。
  • 无法创建第二个数据框 python pandas(Unable to create a second dataframe python pandas)
    问题 我的第二个数据框在创建时没有加载值。 为什么它不起作用的任何帮助? 当我将光标设为列表时,它包含一堆值,但是无论出于何种原因,当我第二次尝试使用 Pandas 执行正常的数据帧加载时,它都不起作用。 我的代码: conn = pyodbc.connect(constr, autocommit=True) cursor = conn.cursor() secondCheckList = [] checkCount = 0 maxValue = 0 strsql = "SELECT * FROM CRMCSVFILE" cursor = cursor.execute(strsql) cols = [] SQLupdateNewIdField = "UPDATE CRMCSVFILE SET NEW_ID = ? WHERE Email_Address_Txt = ? OR TELEPHONE_NUM = ? OR DRIVER_LICENSE_NUM = ?" for row in cursor.description: cols.append(row[0]) df = pd.DataFrame.from_records(cursor) df.columns = cols newIdInt = 1 for row in range(len(df['Email_Address
  • 将熊猫数据框中的行转换为列(Converting rows in pandas dataframe to columns)
    问题 我想在下面转换行。 pandas 数据框到列标题: transition area 0 A_to_B -9.339710e+10 1 B_to_C 2.135599e+02 结果: A_to_B B_to_C 0 -9.339710e+10 2.135599e+02 我尝试使用数据透视表,但这似乎没有给出我想要的结果。 回答1 df = df.T df.columns = df.iloc[0, :] df = df.iloc[1:, :] 回答2 我认为您可以先 set_index 与 column transition ,然后通过 T 转置,通过 rename_axis 和最后 reset_index 删除列名: print df.set_index('transition').T.rename_axis(None, axis=1).reset_index(drop=True) A_to_B B_to_C 0 -9.339710e+10 213.5599
  • Python Pandas:逐行填充数据框(Python pandas: fill a dataframe row by row)
    问题 向pandas.DataFrame对象添加一行的简单任务似乎很难完成。 有3个与此相关的stackoverflow问题,没有一个给出有效的答案。 这就是我想要做的。 我有一个DataFrame,我已经知道它的形状以及行和列的名称。 >>> df = pandas.DataFrame(columns=['a','b','c','d'], index=['x','y','z']) >>> df a b c d x NaN NaN NaN NaN y NaN NaN NaN NaN z NaN NaN NaN NaN 现在,我有一个函数来迭代计算行的值。 如何用字典或pandas.Series填充行pandas.Series ? 这是各种失败的尝试: >>> y = {'a':1, 'b':5, 'c':2, 'd':3} >>> df['y'] = y AssertionError: Length of values does not match length of index 显然,它试图添加一列而不是一行。 >>> y = {'a':1, 'b':5, 'c':2, 'd':3} >>> df.join(y) AttributeError: 'builtin_function_or_method' object has no attribute 'is_unique'
  • 将许多python pandas数据框放到一个excel工作表中(Putting many python pandas dataframes to one excel worksheet)
    问题 只要工作表不同,就可以很容易地将许多熊猫数据框添加到excel工作簿中。 但是,如果要使用内置的df.to_excel功能的熊猫,将许多数据帧放入一个工作表中将有些棘手。 # Creating Excel Writer Object from Pandas writer = pd.ExcelWriter('test.xlsx',engine='xlsxwriter') workbook=writer.book worksheet=workbook.add_worksheet('Validation') df.to_excel(writer,sheet_name='Validation',startrow=0 , startcol=0) another_df.to_excel(writer,sheet_name='Validation',startrow=20, startcol=0) 上面的代码不起作用。 您将得到以下错误 Sheetname 'Validation', with case ignored, is already in use. 现在,我已经进行了足够的实验,以至于找到了使之工作的方法。 writer = pd.ExcelWriter('test.xlsx',engine='xlsxwriter') # Creating Excel Writer Object
  • Python Pandas复制数据框中的行(Python Pandas replicate rows in dataframe)
    问题 如果数据框看起来像: Store,Dept,Date,Weekly_Sales,IsHoliday 1,1,2010-02-05,24924.5,FALSE 1,1,2010-02-12,46039.49,TRUE 1,1,2010-02-19,41595.55,FALSE 1,1,2010-02-26,19403.54,FALSE 1,1,2010-03-05,21827.9,FALSE 1,1,2010-03-12,21043.39,FALSE 1,1,2010-03-19,22136.64,FALSE 1,1,2010-03-26,26229.21,FALSE 1,1,2010-04-02,57258.43,FALSE 我想复制IsHoliday等于TRUE的行,我可以这样做: is_hol = df['IsHoliday'] == True df_try = df[is_hol] df=df.append(df_try*10) 但是有更好的方法吗,因为我需要重复5次假期行,如果使用上述方法,我必须追加5次。 回答1 您可以将df_try放在列表中,然后执行您要考虑的事情: >>> df.append([df_try]*5,ignore_index=True) Store Dept Date Weekly_Sales IsHoliday 0 1 1 2010-02-05
  • JavaScript 中的 Python Pandas 等价物(Python Pandas equivalent in JavaScript)
    问题 使用此 CSV 示例: Source,col1,col2,col3 foo,1,2,3 bar,3,4,5 我使用 Pandas 的标准方法是这样的: 解析CSV 选择列到数据框中( col1和col3 ) 处理列(例如平均col1和col3的值) 有没有像 Pandas 那样的 JavaScript 库? 回答1 这个 wiki 将总结和比较许多pandas的 Javascript 库。 通常,您应该查看d3 Javascript 库。 d3是非常有用的“瑞士军刀”,用于在 Javascript 中处理数据,就像pandas对 Python 有帮助一样。 您可能会看到d3像pandas一样经常使用,即使d3不完全是 DataFrame/Pandas 替代品(即d3没有相同的 API; d3没有Series / DataFrame行为类似于pandas ) Ahmed 的回答解释了如何使用 d3 来实现一些 DataFrame 功能,下面的一些库的灵感来自于使用d3和lodash 。 至于 DataFrame 风格的数据转换(拆分、加入、分组等),这里是一些 Javascript 库的快速列表。 请注意,一些库是 Node.js 又名服务器端 Javascript,一些是浏览器兼容的又名客户端 Javascript,还有一些是 Typescript。 因此,请使用适合您的选项
  • 如何在Python Pandas DataFrame中的特定行中更新值?(How to update values in a specific row in a Python Pandas DataFrame?)
    问题 有了Pandas中不错的索引方法,我就可以用各种方式提取数据了。 另一方面,我仍然对如何更改现有DataFrame中的数据感到困惑。 在下面的代码中,我有两个DataFrames,我的目标是从第二个df的值更新第一个df中特定行的值。 我怎样才能做到这一点? import pandas as pd df = pd.DataFrame({'filename' : ['test0.dat', 'test2.dat'], 'm': [12, 13], 'n' : [None, None]}) df2 = pd.DataFrame({'filename' : 'test2.dat', 'n':16}, index=[0]) # this overwrites the first row but we want to update the second # df.update(df2) # this does not update anything df.loc[df.filename == 'test2.dat'].update(df2) print(df) 给 filename m n 0 test0.dat 12 None 1 test2.dat 13 None [2 rows x 3 columns] 但是我怎么能做到这一点: filename m n 0 test0.dat
  • python:删除熊猫数据框中包含字符串的所有行(python: remove all rows in pandas dataframe that contain a string)
    问题 我有一个名为 data 的 Pandas 数据框,我想删除任何列中包含字符串的所有行。 例如,下面我们看到 'gdp' 列在索引 3 处有一个字符串,在索引 1 处有一个 'cap'。 data = y gdp cap 0 1 2 5 1 2 3 ab 2 8 7 2 3 3 bc 7 4 6 7 7 5 4 8 3 ... 我一直在尝试使用类似这个脚本的东西,因为我不会提前知道 exp_list 中包含什么。 不幸的是,“data.var_name”抛出了这个错误:“DataFrame”对象没有属性“var_name”。 我也不知道字符串会提前是什么,所以无论如何也可以概括一下吗? exp_list = ['gdp', 'cap'] for var_name in exp_list: data = data[data.var_name != 'ab'] 回答1 您可以应用一个函数来逐行测试您的DataFrame是否存在字符串,例如,说df是您的DataFrame rows_with_strings = df.apply( lambda row : any([ isinstance(e, basestring) for e in row ]) , axis=1) 这将为您的 DataFrame 生成一个掩码,指示哪些行至少包含一个字符串。 因此
  • 将列表或系列作为一行附加到pandas DataFrame吗?(Appending a list or series to a pandas DataFrame as a row?)
    问题 因此,我已经初始化了一个空的熊猫DataFrame,并希望迭代地将列表(或Series)追加为该DataFrame中的行。 最好的方法是什么? 回答1 有时,在熊猫之​​外进行所有附加操作会更容易,然后只需创建DataFrame即可。 >>> import pandas as pd >>> simple_list=[['a','b']] >>> simple_list.append(['e','f']) >>> df=pd.DataFrame(simple_list,columns=['col1','col2']) col1 col2 0 a b 1 e f 回答2 df = pd.DataFrame(columns=list("ABC")) df.loc[len(df)] = [1,2,3] 回答3 这是一个简单而愚蠢的解决方案: >>> import pandas as pd >>> df = pd.DataFrame() >>> df = df.append({'foo':1, 'bar':2}, ignore_index=True) 回答4 你能做这样的事吗? >>> import pandas as pd >>> df = pd.DataFrame(columns=['col1', 'col2']) >>> df = df.append(pd.Series(['a'
  • 熊猫/ Python:如何串联两个没有重复的数据框?(Pandas/Python: How to concatenate two dataframes without duplicates?)
    问题 我想将两个数据框A,B连接到一个没有重复行的新数据框(如果B中的行已经存在于A中,则不要添加): 数据框A:数据框B: I II I II 0 1 2 5 6 1 3 1 3 1 新数据框: I II 0 1 2 1 3 1 2 5 6 我怎样才能做到这一点? 回答1 最简单的方法是只进行串联,然后删除重复项。 >>> df1 A B 0 1 2 1 3 1 >>> df2 A B 0 5 6 1 3 1 >>> pandas.concat([df1,df2]).drop_duplicates().reset_index(drop=True) A B 0 1 2 1 3 1 2 5 6 reset_index(drop=True)用于修复concat()和drop_duplicates()之后的索引。 没有它,您将拥有[0,1,0]而不是[0,1,2]的索引。 如果未立即重置该dataframe ,则可能会导致对该dataframe进行进一步操作的问题。 回答2 如果您在DataFrame A中已经有重复的行,然后连接并删除重复的行,将会从DataFrame A中删除您可能想要保留的行。 在这种情况下,您将需要创建一个具有累积计数的新列,然后删除重复项,这完全取决于您的用例,但这在时间序列数据中很常见。 这是一个例子: df_1 = pd.DataFrame([ {'date
  • 检查一个数据框中的单词是否出现在另一个数据框中(python 3,pandas)(Check if words in one dataframe appear in another (python 3, pandas))
    问题 问题:我有两个数据框,想删除它们之间的任何重复项/部分重复项。 DF1 DF2 **Phrases** **Phrases** Little Red Little Red Corvette Grow Your Grow Your Beans James Bond James Dean Tom Brady 我想从 DF1 中删除“Little Red”和“Grow Your”短语,然后将两个 DF 组合起来,使最终产品看起来像: DF3 Little Red Corvette Grow Your Beans James Bond James Dean Tom Brady 请注意,如果所有单词都出现在 DF2 的短语中(例如 Little Red Vs. Little Red Corvette),我只想从 DF1 中删除这些短语。 如果“詹姆斯·迪恩”出现在 DF2 中,我不想从 DF1 中删除“詹姆斯·邦德”。 回答1 我在下面找到了这个解决方案。 目前,它不是很优雅,但它有效。 import pandas as pd df1 = pd.DataFrame(['Little Red', 'Grow Your', 'James Bond', 'Tom Brady']) df2 = pd.DataFrame(['Little Red Corvette', 'Grow Your
  • 比较两个Python Pandas数据框的2列并获取公共行(Comparing 2 columns of two Python Pandas dataframes and getting the common rows)
    问题 我有2个数据框,如下所示: DF1= A B C D 0 AA BA KK 0 1 AD BD LL 0 2 AF BF MM 0 DF2= K L 0 AA BA 1 AD BF 2 AF BF 最后,我想得到的是: DF1= A B C D 0 AA BA KK 1 1 AD BD LL 0 2 AF BF MM 1 因此,我想比较两个数据帧,我想查看第一数据帧的哪些行(针对列A和B)与第二数据帧(列K和L)相同,并在第一数据帧的列D上分配1。 我可以使用for循环,但是输入大量条目会很慢。 任何线索或建议,将不胜感激。 回答1 如果重命名df2的列,然后可以逐行进行比较,这会更容易: In [35]: df2.columns = ['A', 'B'] df2 Out[35]: A B 0 AA BA 1 AD BF 2 AF BF In [38]: df1['D'] = (df1[['A', 'B']] == df2).all(axis=1).astype(int) df1 Out[38]: A B C D 0 AA BA KK 1 1 AD BD LL 0 2 AF BF MM 1 回答2 df1['ColumnName'].isin(df2['ColumnName']).value_counts() 回答3 这是我解决的方法: df1 = pd.DataFrame(
  • 按索引合并两个数据框(Merge two dataframes by index)
    问题 我有以下数据框: > df1 id begin conditional confidence discoveryTechnique 0 278 56 false 0.0 1 1 421 18 false 0.0 1 > df2 concept 0 A 1 B 如何合并索引以获取: id begin conditional confidence discoveryTechnique concept 0 278 56 false 0.0 1 A 1 421 18 false 0.0 1 B 我问是因为我的理解是merge()即df1.merge(df2)使用列来进行匹配。 实际上,这样做我得到: Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/usr/local/lib/python2.7/dist-packages/pandas/core/frame.py", line 4618, in merge copy=copy, indicator=indicator) File "/usr/local/lib/python2.7/dist-packages/pandas/tools/merge.py", line 58, in merge copy=copy