Форматирование списка текста в столбцы

Чтобы получить более ясность, давайте посмотрим на DataFrame с двумя уровнями в его индексе (MultiIndex).

index = pd.MultiIndex.from_product([['TX', 'FL', 'CA'], 
                                    ['North', 'South']], 
                                   names=['State', 'Direction'])

df = pd.DataFrame(index=index, 
                  data=np.random.randint(0, 10, (6,4)), 
                  columns=list('abcd'))

Метод reset_index, вызываемый параметрами по умолчанию, преобразует все индексы в столбцы и использует простой RangeIndex в качестве нового индекса.

df.reset_index()

Используйте параметр level для управления тем, какие уровни индексов преобразуются в столбцы. Если возможно, используйте имя уровня, которое является более явным. Если имена уровней отсутствуют, вы можете ссылаться на каждый уровень по его целочисленному местоположению, которое начинается с 0 извне. Вы можете использовать скалярное значение здесь или список всех индексов, которые вы хотели бы сбросить.

df.reset_index(level='State') # same as df.reset_index(level=0)

В редком случае, когда вы хотите сохранить индекс и превратить индекс в столбец, вы можете сделать следующее:

# for a single level
df.assign(State=df.index.get_level_values('State'))

# for all levels
df.assign(**df.index.to_frame())

16
задан crystalattice 6 October 2008 в 02:33
поделиться

4 ответа

Два столбца, разделенные вкладками, к которым присоединяются в строки. Посмотрите в itertools для эквивалентов итератора, для достижения эффективного решения пространства.

import string
def fmtpairs(mylist):
    pairs = zip(mylist[::2],mylist[1::2])
    return '\n'.join('\t'.join(i) for i in pairs)

print fmtpairs(list(string.ascii_uppercase))

A   B
C   D
E   F
G   H
I   J
...

ой... был пойман S.Lott (спасибо).

А более общее решение, обрабатывает любое число столбцов и нечетных списков. Немного измененный от S.lott, с помощью генераторов для оставления свободного места.

def fmtcols(mylist, cols):
    lines = ("\t".join(mylist[i:i+cols]) for i in xrange(0,len(mylist),cols))
    return '\n'.join(lines)
11
ответ дан 30 November 2019 в 22:10
поделиться

Это многоречиво, таким образом, я буду повреждать его в две части.

def columns( skills_defs, cols=2 ):
    pairs = [ "\t".join(skills_defs[i:i+cols]) for i in range(0,len(skills_defs),cols) ]
    return "\n".join( pairs )

Это может, очевидно, быть сделано как единственный loooong оператор.

Это работает на нечетное число навыков, также.

3
ответ дан 30 November 2019 в 22:10
поделиться
data = [ ("1","2"),("3","4") ]
print "\n".join(map("\t".join,data))

Не столь гибкий как решение ActiveState, но короче :-)

0
ответ дан 30 November 2019 в 22:10
поделиться

Эти format_columns функция должна сделать то, что Вы хотите:

from __future__ import generators
try: import itertools
except ImportError: mymap, myzip= map, zip
else: mymap, myzip= itertools.imap, itertools.izip

def format_columns(string_list, columns, separator=" "):
    "Produce equal-width columns from string_list"
    sublists= []

    # empty_str based on item 0 of string_list
    try:
        empty_str= type(string_list[0])()
    except IndexError: # string_list is empty
        return

    # create a sublist for every column
    for column in xrange(columns):
            sublists.append(string_list[column::columns])

    # find maximum length of a column
    max_sublist_len= max(mymap(len, sublists))

    # make all columns same length
    for sublist in sublists:
         if len(sublist) < max_sublist_len:
             sublist.append(empty_str)

    # calculate a format string for the output lines
    format_str= separator.join(
        "%%-%ds" % max(mymap(len, sublist))
         for sublist in sublists)

    for line_items in myzip(*sublists):
        yield format_str % line_items

if __name__ == "__main__":
    skills_defs = ["ACM:Aircraft Mechanic", "BC:Body Combat", "BIO:Biology",
        "CBE:Combat Engineer", "CHM:Chemistry", "CMP:Computers",
        "CRM:Combat Rifeman", "CVE:Civil Engineer", "DIS:Disguise",
        "ELC:Electronics","EQ:Equestrian", "FO:Forward Observer",
        "FOR:Forage", "FRG:Forgery", "FRM:Farming", "FSH:Fishing",
        "GEO:Geology", "GS:Gunsmith", "HW:Heavy Weapons", "IF:Indirect Fire",
        "INS:Instruction", "INT:Interrogation", "JP:Jet Pilot", "LB:Longbow",
        "LAP:Light Aircraft Pilot", "LCG:Large Caliber Gun", "LNG:Language",
        "LP:Lockpick", "MC:Melee Combat", "MCY:Motorcycle", "MEC:Mechanic",
        "MED:Medical", "MET:Meterology", "MNE:Mining Engineer",
        "MTL:Metallurgy", "MTN:Mountaineering", "NWH:Nuclear Warhead",
        "PAR:Parachute", "PST:Pistol", "RCN:Recon", "RWP:Rotary Wing Pilot",
        "SBH:Small Boat Handling","SCD:Scuba Diving", "SCR:Scrounging",
        "SWM:Swimming", "TW:Thrown Weapon", "TVD:Tracked Vehicle Driver",
        "WVD:Wheeled Vehicle Driver"]

    for line in format_columns(skills_defs, 2):
        print line

Это предполагает, что у Вас есть Python с доступными генераторами.

0
ответ дан 30 November 2019 в 22:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: