Home Php C# Sql C C++ Javascript Python Java Go Android Git Linux Asp.net Django .net Node.js Ios Xcode Cocoa Iphone Mysql Tomcat Mongodb Bash Objective-c Scala Visual-studio Apache Elasticsearch Jar Eclipse Jquery Ruby-on-rails Ruby Rubygems Android-studio Spring Lua Sqlite Emacs Ubuntu Perl Docker Swift Amazon-web-services Svn Html Ajax Xml Java-ee Maven Intellij-idea Rvm Macos Unix Css Ipad Postgresql Css3 Json Windows-server Vue.js Typescript Oracle Hibernate Internet-explorer Github Tensorflow Laravel Symfony Redis Html5 Google-app-engine Nginx Firefox Sqlalchemy Lucene Erlang Flask Vim Solr Webview Facebook Zend-framework Virtualenv Nosql Ide Twitter Safari Flutter Bundle Phonegap Centos Sphinx Actionscript Tornado Register | Login | Edit Tags | New Questions | 繁体 | 简体


10 questions online user: 26

0
votes
answers
8 views
+10

Groupby在Pandas

1

我的代碼正在工作,這是很好的笑聲,但輸出的方式不同。Groupby在Pandas

更新的代碼SINCE RECIEVING ANSWER

import pandas as pd 

# Import File 
YMM = pd.read_excel('C:/Users/PCTR261010/Desktop/OMIX_YMM_2016.xlsx').groupby(['Make','Model']).agg({'StartYear':'min', 'EndYear':'max'}) 

print(YMM) 

輸出類似於製作|模型| StartYear | EndYear,所有列在列列下方的模型列旁邊的生成列。但是這些製作過程就像一個數據透視表一樣。

這裏是一個屏幕截圖:
enter image description here

我下一步需要美國汽車的每一個美國汽車型號,每別克未來每一個別克模型等。

下面是樣本數據的鏈接: http://jmp.sh/KLZKWVZ

+0

不要鏈接到數據。改爲在此分享。 –

沙发
0
2

試試這個:

res = YMM.groupby(['Make','Model'], as_index=False).agg({'StartYear':'min', 'EndYear':'max'}) 

res = YMM.groupby(['Make','Model']).agg({'StartYear':'min', 'EndYear':'max'}).reset_index() 
+0

就是這樣!我和.agg一起玩,無法達成目標。現在我只需要Make就可以重複模型旁邊的列。 –

+0

@SamRussoPalmer,很高興它有幫助。我的公司防火牆不允許我下載您的示例數據...我可以在家以後下載它。你可以發佈一個期望的數據集的例子,因爲('需要Make重複在Model旁邊的列)'不對我清楚 – MaxU

+0

已更新,但我不得不做一個屏幕截圖,但下面我解釋了。 –

板凳
0
1

用自己的代碼

Min = YMM.groupby(['Make','Model']).StartYear.min() 
Max = YMM.groupby(['Make','Model']).EndYear.max() 

Min['Endyear']=Max.EndYear 
0
votes
answers
12 views
+10

如何在python

-4

創建數據幀我有表像下面 (在這個例子中,它代表的名單,但這不需要是給出列表)如何在python

age=[3,4,5,6] 

sex=[1,2] 

limit=[3,4] 

我想創建數據幀,其有各種組合。

但「限制」列超過「年齡」列。

所以我期望的結果是這樣的。

age sex limit 
3 1 3 
3 1 4 
4 1 4 
3 2 3 
3 2 4 
4 2 4 

我該如何得到這個結果?

+0

OK,你嘗試過這麼遠嗎? –

+0

你可以用一些編程來得到這個結果。你有沒有嘗試過? – Julien

+0

提示:用於... for .. if ..等向我們展示你的嘗試。 – rnso

沙发
0
1

此解決方案使用Numpy和Pandas使用'limit'大於或等於'age'的約束創建組合的數據框。請注意,您的帖子中寫道:「大於」,但你的輸出的例子顯示了「大於或等於」:

import itertools 
age=[3,4,5,6] 
sex=[1,2] 
limit=[3,4] 
a = [age, sex, limit] 
mylist = list(itertools.product(*a)) 

import pandas as pd 
import numpy as np 
df = pd.DataFrame(np.array(mylist).reshape(len(mylist),3), columns = ["age","sex","limit"]) 

df2 = df[df['limit'] >= df['age']] 
print df2.to_string(index=False) 

輸出是:

age sex limit 
    3 1  3 
    3 1  4 
    3 2  3 
    3 2  4 
    4 1  4 
    4 2  4   
板凳
0
0

基本數據:

age=[3,4,5,6] 
sex=[1,2] 
limit=[3,4] 

使用列表理解結合forif的下列代碼檢查每個組合:

lst = [(a, s, l) 
     for a in age 
     for l in limit 
     if l >= a 
     for s in sex] 
df = pd.DataFrame(data=lst, columns=["age","sex","limit"]) 
print(df) 

輸出:

age sex limit 
0 3 1  3 
1 3 1  4 
2 3 2  3 
3 3 2  4 
4 4 1  4 
5 4 2  4 
0
votes
answers
12 views
+10

根據條件改變熊貓的日期值並轉換爲日期時間

1

我有一個數據框,其中的列看起來像一個日期,但實際上是一個對象(type 'O')。該列中的某些值的值爲9999-12-31 00:00:00.000。它們在某種意義上是一個指標,表明一行是「無限期」有效的。根據條件改變熊貓的日期值並轉換爲日期時間

pd.to_datetime()不符合這些值,並給出「日期超出範圍」錯誤。我試圖編寫一個函數將值轉換爲一個字符串,然後檢查第一個字符以查看它是否爲9,但這也不起作用。

只要你相信,我已經試過的東西,這是兩個功能我曾嘗試:

def change_to_datetime(df, colname): 
    for index, row in df.iterrows(): 
     string = str(row[12]) 
     if string[0] == '9': 
      row[12] = '2018-01-01 00:00:00.000' 
     row[12] = pd.to_datetime(row[12]) 
    return df 

和:

def change_to_datetime2(df, colname): 
    mask = str(df.colname)[0] == '9' 
    df.loc[mask, colname] = '2018-01-01 00:00:00.000' 
    df[colname] = pd.to_datetime(df[colname]) 
    return df 

我也曾在這裏閱讀其他類似的問題,但他們沒有幫助我。我是熊貓的新手。

沙发
0
1

如果9999是唯一的問題,您可以使用errors='coerce'無效的輸入轉換爲NaT空值。然後,您可以用'2018-01-01 00:00:00.000'

使用此填補那些並將其分配給任何列你想

filler = pd.to_datetime('2018-01-01') 
pd.to_datetime(df[colname], errors='coerce').fillna(filler) 
板凳
0
1

你能用df.replace()代替字符串'9999-12-31 00:00:00.000'嗎?

df.replace(to_replace='9999-12-31 00:00:00.000', value='2018-01-01 00:00:00.000', inplace = True)

https://pandas.pydata.org/pandas-docs/version/0.21/generated/pandas.DataFrame.replace.html

0
votes
answers
10 views
+10

熊貓DataFrame:如果滿足多個條件,則將整數分配給新列

0

我試圖在熊貓數據框中創建一個新列,然後根據條件格式分配一個整數值。一個例子是:熊貓DataFrame:如果滿足多個條件,則將整數分配給新列

如果((A> 1)&(一個< 5))得到值10,如果((A> = 5)&(一個< 10))得到的值24,如果((一> 10)&(a < 5))給出值57

其中'a'是數據框中的另一列。

有沒有辦法做到這一點與熊貓/ numpy沒有創建一個函數?我嘗試了幾種不同的選擇,但都沒有成功

+0

發佈您的數據框的例子會有所幫助。可能很難理解這個。數據框中的'a'是另一列嗎?或一些隨機變量? – Abhishek

沙发
0
0

使用pd.cut

df = pd.DataFrame({'a': [ 
    2, 3, 5,7,8,10,100]}) 
pd.cut(df.a,bins=[1,5,10,np.inf],labels=[10,24,57]) 
Out[282]: 
0 10 
1 10 
2 10 
3 24 
4 24 
5 24 
6 57 
Name: a, dtype: category 
Categories (3, int64): [10 < 24 < 57] 
+0

@丹是幫助,你能考慮接受嗎? – Wen

+0

當然,應該做到了 – Dan

板凳
0
-1

我想這樣做,而無需創建功能將是非常迂迴的任何方式,但它實際上不是太糟糕了功能。此外,你的條件並不真正相互關聯,但我認爲這是一個錯字。如果你的條件比較簡單,可以快速定義你的功能,讓您的代碼緊湊:

df['new column'] = df['a'].apply(lambda x: 10 if x < 5 else 24 if x < 10 else 57) 

,可以得到一點毛茸茸的,如果你的條件,更complicatied - 這是更容易,如果你定義的功能來管理更明確:

def f(x): 
    if x > 1 and x < 5: return 10 
    elif x >= 5 and x < 10: return 14 
    else: return 57 

df['new column'] = df['a'].apply(f) 

如果你真的想避免的功能,我能想到的是創建一個新的列表爲新柱,通過你的數據迭代,然後將它添加到您的數據框填充它的最好的:

newcol = [] 
for a in df['a'].values: 
    if x > 1 and x < 5: newcol.append(10) 
    elif x >= 5 and x < 10: newcol.append(24) 
    else: newcol.append(57) 
df['newcol'] = newcol 
0
votes
answers
12 views
+10

Pandas group by weekday(M/T/W/T/F/S/S)

1

我有一個包含YYYY-MM-DD('arrival_date')形式的時間序列(作爲索引)的熊貓數據幀和I我想每個星期一到星期天都要分組,以便計算其他列的平均值,中位數,標準偏差等等。我最終應該只有七行,到目前爲止我只知道如何按周分組,每週彙總一切。Pandas group by weekday(M/T/W/T/F/S/S)

# Reading the data 
df_data = pd.read_csv('data.csv', delimiter=',') 

# Providing the correct format for the data 
df_data = pd.to_datetime(df_data['arrival_date'], format='%Y%m%d') 

# Converting the time series column to index 
df_data.index = pd.to_datetime(df_data['arrival_date'], unit='d') 

# Grouping by week (= ~52 rows per year) 
week_df = df_data.resample('W').mean() 

有一個簡單的方法來實現我的目標,大熊貓?我正在考慮選擇每個其他第7個元素,並對結果數組執行操作,但這似乎不必要的複雜。

數據幀的頭部看起來像這樣

 arrival_date price 1 price_2   price_3  price_4 
2  20170816  75.945298 1309.715056  71.510215  22.721958 
3  20170817  68.803269 1498.639663  64.675232  22.759137 
4  20170818  73.497144 1285.122022  65.620260  24.381532 
5  20170819  78.556828 1377.318509  74.028607  26.882429 
6  20170820  57.092189 1239.530625  51.942213  22.056378 
7  20170821  76.278975 1493.385548  74.801641  27.471604 
8  20170822  79.006604 1241.603185  75.360606  28.250994 
9  20170823  76.097351 1243.586084  73.459963  24.500618 
10  20170824  64.860259 1231.325899  63.205554  25.015120 
11  20170825  70.407325 975.091107  64.180692  27.177654 
12  20170826  87.742284 1351.306100  79.049023  27.860549 
13  20170827  58.014005 1208.424489  51.963388  21.049374 
14  20170828  65.774114 1289.341335  59.922912  24.481232 
+0

你可以添加數據樣本? – jezrael

沙发
0
2

我相信你需要第一個參數parse_datesread_csv用於解析列於日期時間,然後通過weekday_name和彙總groupby

df_data = pd.read_csv('data.csv', parse_dates=['arrival_date']) 

week_df = df_data.groupby(df_data['arrival_date'].dt.weekday_name).mean() 
print (week_df) 
       price_1  price_2 price_3 price_4 
arrival_date            
Friday  71.952235 1130.106565 64.900476 25.779593 
Monday  71.026544 1391.363442 67.362277 25.976418 
Saturday  83.149556 1364.312304 76.538815 27.371489 
Sunday  57.553097 1223.977557 51.952801 21.552876 
Thursday  66.831764 1364.982781 63.940393 23.887128 
Tuesday  79.006604 1241.603185 75.360606 28.250994 
Wednesday  76.021324 1276.650570 72.485089 23.611288 

對於數字索引使用weekday

week_df = df_data.groupby(df_data['arrival_date'].dt.weekday).mean() 
print (week_df) 
       price_1  price_2 price_3 price_4 
arrival_date            
0    71.026544 1391.363442 67.362277 25.976418 
1    79.006604 1241.603185 75.360606 28.250994 
2    76.021324 1276.650570 72.485089 23.611288 
3    66.831764 1364.982781 63.940393 23.887128 
4    71.952235 1130.106565 64.900476 25.779593 
5    83.149556 1364.312304 76.538815 27.371489 
6    57.553097 1223.977557 51.952801 21.552876 

編輯:

對於正確的順序添加reindex

days = ['Monday','Tuesday','Wednesday','Thursday','Friday','Saturday', 'Sunday'] 
week_df = df_data.groupby(df_data['arrival_date'].dt.weekday_name).mean().reindex(days) 
print (week_df) 
       price_1  price_2 price_3 price_4 
arrival_date            
Monday  71.026544 1391.363442 67.362277 25.976418 
Tuesday  79.006604 1241.603185 75.360606 28.250994 
Wednesday  76.021324 1276.650570 72.485089 23.611288 
Thursday  66.831764 1364.982781 63.940393 23.887128 
Friday  71.952235 1130.106565 64.900476 25.779593 
Saturday  83.149556 1364.312304 76.538815 27.371489 
Sunday  57.553097 1223.977557 51.952801 21.552876 
+1

我知道這不是它的地方,但我想感謝您的驚人快速,簡明和明確的答案! – mannaroth

+0

歡迎您!美好的一天! – jezrael

+0

有什麼明顯的原因是天的順序是:「星期五/星期一/星期六/ ......」? – mannaroth

0
votes
answers
8 views
+10

在熊貓

0

分組轉換分組堆積列到多列,我組織了我的數據框使用GROUPBY功能看起來是這樣的:在熊貓

Compound Sample Concentration x y 
Benzene A   15    Ax Ay 
      B   20    Bx By 
      C   17    Cx Cy 

Toluene A   23    Ax Ay 
      B   40    Bx By 

Xylene  A   70    Ax Ay 
      B   62    Bx By 
      C   55    Cx Cy 
      D   32    Dx Dy 

如何拆散列到同一高度的多個列與分組作爲列名?我想實現這樣的事情:

Sample Benzene Toluene Xylene x y 
A   15  23   70  Ax Ay 
B   20  40   62  Bx By 
C   17  0   55  Cx Cy 
D   0   0   32  Dx Dy  

編輯 我失去了指標後,我用了GROUPBY功能,用我的數據是這樣的:

Compound  Sample  Concentration   x y 
1 Benzene  A    15      Ax Ay 
5 Benzene  B    20      Bx By 
6 Benzene  C    17      Cx Cy 
0 Toluene  A    23      Ax Ay 
4 Toluene  B    40      Bx By 
2 Xylene  A    70      Ax Ay 
3 Xylene  B    62      Bx By 
7 Xylene  C    55      Cx Cy 
8 Xylene  D    32      Dx Dy 

我複方排序,以便重新安排所有索引最初按樣本排序

+0

https://pandas.pydata.org/pandas- docby/stable/generated/pandas.DataFrame.unstack.html – Abhishek

沙发
0
0

根據您的發佈,您不清楚索引中的哪些列。如果他們都不是(你可以用df.reset_index()力),那麼你就可以做到以下幾點:這不你的輸出相匹配

df.set_index(['Compound', 'Sample', 'x', 'y'], inplace = True) 
df = df['Concentration'] 
df = df.unstack(level = 0) 
df.reset_index(inplace = True) 

的唯一途徑是,X和Y列現在位於數據的左側。由於這些列看起來像樣本字母很容易構建,因此在轉換後添加它們可能更容易。也就是說,如果你的團隊通過給你與索引化合物和樣品,和濃度的數據框作爲唯一的列,你可能只是做:

df = df['Concentration'].unstack(level = 0) 

,然後添加你的X和Y列。

編輯:從您的原始數據,你也可以做到這一點,它做了你與GROUPBY做了什麼,一步到位會重塑:

df2 = pd.pivot_table(df, index = ['Sample', 'x', 'y'], columns = 'Compound', values = 'Concentration') 
+0

groupby函數會根據索引對列進行分組,除非您明確地告訴它不要使用as_index = False選項)。化合物名稱不顯示在每一行的事實使我認爲它是索引的一部分。 –

+0

我按所有列分組,所以我可能已將所有值放在索引中?我不確定它是如何工作的。我編輯了我的問題,以顯示在使用groupby函數之前它的樣子。 –

0
votes
answers
7 views
+10

執行使用兩個列作爲參數GROUPBY功能無論給定以下數據幀中的列

0

的量級:執行使用兩個列作爲參數GROUPBY功能無論給定以下數據幀中的列

Node_1 Node_2 Time 
A  B  6 
A  B  4 
B  A  2 
B  C  5 

一個如何獲得,使用GROUPBY或其它方法中,數據幀如下:

Node_1 Node_2 Mean_Time 
A  B  4 
B  C  5 

第一行的通過找到的所有路由的平均A-> B和B-> A而獲得Mean_Time,即(6 + 4 + 2)/3 = 4

+0

將列連接在一起,然後執行「mean」操作? –

沙发
0
0

在應該克東西線香港專業教育學院,你所期望的結果......這讓醜陋了很多比它:d

import pandas as pd 

data = {'Node_1': {0: 'A', 1: 'A', 2: 'B', 3: 'B'}, 
'Node_2': {0: 'B', 1: 'B', 2: 'A', 3: 'C'}, 
'Time': {0: 6, 1: 4, 2: 2, 3: 5}} 

df = pd.DataFrame(data) 

# Create new column to group by 
df["Node"] = df[["Node_1","Node_2"]].apply(lambda x: tuple(sorted(x)),axis=1) 
# Create Mean_time column 
df["Mean_time"] = df.groupby('Node').transform('mean') 
# Drop duplicate rows and drop Node and Time columns 
df = df.drop_duplicates("Node").drop(['Node','Time'],axis=1) 

print(df) 

返回:

 Node_1 Node_2 Mean_time 
0  A  B   4 
3  B  C   5 

另一種方法是使用:

df = (df.groupby('Node', as_index=False) 
      .agg({'Node_1':lambda x: list(x)[0], 
        'Node_2':lambda x: list(x)[0], 
        'Time': np.mean}) 
      .drop('Node',axis=1)) 
+0

@WeiErn我不明白,這也適用於名字。 –

+0

感謝您的建議,安東!我打算讓大寫字母作爲可能包含一個或多個單詞的節點的實際名稱的佔位符,例如「紐約」。 我試着將用於創建「節點」列的代碼更改爲[排序(x)],但它變成了一個二維列表。有什麼地方可以讓列成爲兩個字符串的列表嗎? –

+0

@WeiErn分享一些樣品數據! :) –

板凳
0
1

你可以使用np.sortNode_1Node_2列的每一行進行排序:

nodes = df.filter(regex='Node') 
arr = np.sort(nodes.values, axis=1) 
df.loc[:, nodes.columns] = arr 

導致df現在看起來像:

Node_1 Node_2 Time 
0  A  B  6 
1  A  B  4 
2  A  B  2 
3  B  C  5 

隨着Node列排序,你可以groupby/agg像往常一樣:

result = df.groupby(cols).agg('mean').reset_index() 

import numpy as np 
import pandas as pd 

data = {'Node_1': {0: 'A', 1: 'A', 2: 'B', 3: 'B'}, 
'Node_2': {0: 'B', 1: 'B', 2: 'A', 3: 'C'}, 
'Time': {0: 6, 1: 4, 2: 2, 3: 5}} 

df = pd.DataFrame(data) 
nodes = df.filter(regex='Node') 
arr = np.sort(nodes.values, axis=1) 
cols = nodes.columns.tolist() 
df.loc[:, nodes.columns] = arr 

result = df.groupby(cols).agg('mean').reset_index() 
print(result) 

產量

Node_1 Node_2 Time 
0  A  B  4 
1  B  C  5 
0
votes
answers
8 views
+10

熊貓:如何採取一系列的每n行

1

假設熊貓:如何採取一系列的每n行

s = pd.Series(range(50))

0  0 
1  1 
2  2 
3  3 
... 
48  48 
49  49 

我怎樣才能得到新的系列,它由每n行的總和的總和?

預期結果如下,當n = 5時;

0  10 
1  35 
2  60 
3  85 
... 
8  210 
9  235 

如果使用loc或iloc並通過python循環,當然可以實現,但我相信它可以簡單地用Pandas方式完成。

此外,這是一個非常簡單的例子,我不期望對序列的解釋:)。我正在嘗試的實際數據系列具有時間索引和每秒發生的事件數作爲值。

+0

[更多pythonic/pandorable方法來循環熊貓系列]可能的副本(https://stackoverflow.com/questions/41485471/more-pythonic-pandorable-approach-to-looping-over-a-pandas-系列) – miradulo

+0

非常感謝miradulo-san,但是你給我看的答案對我來說太多了。我將在稍後參考。 – HirofumiTamori

沙发
0
1

groupby + sum

s.groupby(s.index // 5 * 5).sum() 

0  10 
5  35 
10  60 
15  85 
20 110 
25 135 
30 160 
35 185 
40 210 
45 235 

組塊中的索引的5和組相應的基團。

0
votes
answers
13 views
+10

遍歷pandas中的數據幀數組並繪製列值

-1

我有一個數據幀數組:myArr=[df1,df2,df3]這些數據幀中的每一個都有3列,我希望在循環中繪圖。遍歷pandas中的數據幀數組並繪製列值

colName = ['name1','name2','name3'] 
df_collection = [df1,df2,df3] 
traces =[] 
for x in range(2): 
    traces.append(
     go.Scatter(
      x=df_collection[x], 
      y=df_collection[x][colName[x]], 
     ) 
    ) 

fig = go.Figure(data=traces, layout=layout) 
py.offline.iplot(fig) 

我得到

TypeError: Object of type 'DataFrame' is not JSON serializable

+0

我假設'plotly'需要json序列化的對象。試試'data.to_dict()' –

沙发
0
0

萬一別人是有同樣的問題。問題是x軸上的值需要爲x=df_collection[x].index.values

0
votes
answers
13 views
+10

我有最初是csv文件的熊貓數組。我想從列中的所有行刪除特定的詞:文本

1

這裏是熊貓數組:我有最初是csv文件的熊貓數組。我想從列中的所有行刪除特定的詞:文本

id   text          spam 
4016  Subject: re : vacation vince : i just found ... 0 
4017  Subject: re : receipts from visit jim , than... 0 
4018  Subject: re : enron case study update wow ! a...0 
4019  Subject: re : interest david , please , call... 0 
4020  Subject: news : aurora 5 . 2 update aurora ve...0 

我想刪除所有列「文」字「主題」行,使其成爲:

id   text          spam 
4016  re : vacation vince : i just found ... 0 
4017  re : receipts from visit jim , than... 0 
4018  re : enron case study update wow ! a...0 
4019  re : interest david , please , call... 0 
4020  news : aurora 5 . 2 update aurora ve...0 
沙发
0
2

我認爲你需要replace - ^手段開始每個字符串和s+一個或多個空格:

df['text'] = df['text'].replace('^Subject:s+', '', regex=True) 
print (df) 
    id          text spam 
0 4016 re : vacation vince : i just found ...  0 
1 4017 re : receipts from visit jim , than...  0 
2 4018 re : enron case study update wow ! a...  0 
3 4019 re : interest david , please , call...  0 
4 4020 news : aurora 5 . 2 update aurora ve...  0 

但如果需要刪除第一9字符包括whitespace S:

df['text'] = df['text'].str[9:] 
板凳
0
1

試試這個:

df.text = df.text.apply(lambda row: row[9:]) 

每一行都將在列改爲「文字」,其中第9個字符「主題:」是祛瘀編輯。