python - 使用 Python 将 CSV 元素从列合并到行

标签 python python-2.7 csv pandas

(实际输入的 CSV 通常以逗号分隔;我只是将我的想法显示为表格以便于查看。)

这是我想使用Python 2.7做的一个例子(Pandas,如果它更好/更容易,但我也喜欢学习Python逻辑,Pandas跳过了很多,尽管我可能需要学习它来完成这样的事情):

来自

Price    Name    Text      Number    Choice   URL         Email
$40      Foo     Stuff     560       Y        www.a.com   a@a.com
$60      Foo     Things    280       N        www.a.com   a@a.com
$20      Foo     Other     120       Y        www.a.com   a@a.com
$25      John    Gals      1222      N        www.b.com   b@b.com
$100     Bar     Dudes     999       Y        www.c.com   c@c.com
$250     Bar     Guys      200       Y        www.c.com   c@c.com

Name    Price1    Price2   Price3   Text1    Text2    Text3    Number1    Number2    Number3    Choice1    Choice2    Choice3    URL         Email
Foo     $40       $60      $20      Stuff    Things   Other    560        280        120        Y          N          Y          www.a.com   a@a.com
John    $25                         Gals                       1222                             N                                www.b.com   b@b.com
Bar     $100      $250              Dudes    Guys              999        200                   Y          Y                     www.c.com   c@c.com

尽管我通常想按名称列进行组合,但列的顺序并不重要。 (希望我的理解是正确的,因为仅仅举这个例子就很痛苦!)

为了额外加分,如果单元格为空,我希望阻止单元格填充新列:例如如果上面 From 中的第 2 行缺少 a@a.com,则 To 看起来是一样的,不会生成“Email2”列。另外,虽然列的顺序并不重要(我使用它来填充需要 CSV 输入的数据库),但编号必须匹配!也就是说,对于任何给定的名称,例如上面的 Foo:$60、Things、280 和 N 都必须位于标记为“[OrigName]2”的列中 - 并且在任何给定标签的 column1 为空白时,不应填充 Column2。

这应该很容易,但为了完整起见,我还需要一列将填充的文本列(例如,整数列“文本数量”)相加,另一列将标记为“的“价格”数量相加免费”(例如“免费文本数量”)。

非常感谢您的帮助 - 我已经对从中学到的东西感到兴奋,并且随时欢迎进一步的阅读资源!

最佳答案

在[252]中:

import pandas as pd
import io

f = io.BytesIO("""Price    Name    Text      Number    Choice   URL         Email
40      Foo     Stuff     560       Y        www.a.com   a@a.com
60      Foo     Things    280       N        www.a.com   
20      Foo     Other     120       Y        www.a.com   a@a.com
25      John    Gals      1222      N        www.b.com   b@b.com
100     Bar     Dudes     999       Y        www.c.com   c@c.com
250     Bar     Guys      200       Y        www.c.com   c@c.com""")

df = pd.read_csv(f, delim_whitespace=True)
print df

输出:

   Price  Name    Text  Number Choice        URL    Email
0     40   Foo   Stuff     560      Y  www.a.com  a@a.com
1     60   Foo  Things     280      N  www.a.com      NaN
2     20   Foo   Other     120      Y  www.a.com  a@a.com
3     25  John    Gals    1222      N  www.b.com  b@b.com
4    100   Bar   Dudes     999      Y  www.c.com  c@c.com
5    250   Bar    Guys     200      Y  www.c.com  c@c.com

在[253]中:

split_columns = ["Price", "Text", "Number", "Choice"]

def split_func(df):
    return df.set_index(np.arange(1, df.shape[0]+1))

df2 = df[split_columns].groupby(df.Name).apply(split_func).unstack()
df2.columns = [name+str(i) for name, i in df2.columns]
print df2

输出:

      Price1  Price2  Price3  Text1   Text2  Text3  Number1  Number2  Number3  \
Name                                                                            
Bar      100     250     NaN  Dudes    Guys    NaN      999      200      NaN   
Foo       40      60      20  Stuff  Things  Other      560      280      120   
John      25     NaN     NaN   Gals     NaN    NaN     1222      NaN      NaN   

     Choice1 Choice2 Choice3  
Name                          
Bar        Y       Y     NaN  
Foo        Y       N       Y  
John       N     NaN     NaN  

在[245]中:

unique_columns = ["URL", "Email"]

def unique_func(s):
    return s.dropna().unique()[0]

df3 = df[unique_columns].groupby(df.Name).agg(unique_func)
print df3

输出:

            URL    Email
Name                    
Bar   www.c.com  c@c.com
Foo   www.a.com  a@a.com
John  www.b.com  b@b.com

在[246]中:

print pd.merge(df2, df3, left_index=True, right_index=True)

输出:

      Price1  Price2  Price3  Text1   Text2  Text3  Number1  Number2  Number3  \
Name                                                                            
Bar      100     250     NaN  Dudes    Guys    NaN      999      200      NaN   
Foo       40      60      20  Stuff  Things  Other      560      280      120   
John      25     NaN     NaN   Gals     NaN    NaN     1222      NaN      NaN   

     Choice1 Choice2 Choice3        URL    Email  
Name                                              
Bar        Y       Y     NaN  www.c.com  c@c.com  
Foo        Y       N       Y  www.a.com  a@a.com  
John       N     NaN     NaN  www.b.com  b@b.com  

关于python - 使用 Python 将 CSV 元素从列合并到行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19802923/

相关文章:

python - scikit的线性判别分析和Fisher判别分析是同一种方法吗?

python - 折叠数据框枢轴到单行

python - 将不同列长度的 numpy 矩阵的条目放入一维数组中

Python动态多处理和信号问题

python - 解析 Pandas 中的大字符串值

python - 使用命令行垂直分割csv文件

python - PyQt4:创建返回参数的自定义对话框

python - 该类(class)如何工作? (与Quantopian,Python和Pandas有关)

python - 如何将convert命令更改为python代码

Python CSV : Find identical data in two CSV files and copy corresponding data